Mysql,一列值基于同一表中的其他列更改

时间:2014-10-15 07:45:09

标签: mysql sql

这是表格:

table_test

ID------INT
DETAIL--TEXT
VALUE---INT
STATUS--INT DEFAULT 1

此处列STATUS的默认值为1,列VALUE的默认值为1。

此处任何情况下插入更新

if column VALUE < 1 , STATUS = 2 else STATUS = 1

如何在MySQL表中保留上层类型的场景?

3 个答案:

答案 0 :(得分:1)

您可以通过几个触发器执行此操作:

delimiter //
CREATE TRIGGER table_test_update_tr BEFORE UPDATE ON table_test
    FOR EACH ROW
    BEGIN
        IF NEW.value < 0 THEN
            SET NEW.status = 2;
        ELSE
            SET NEW.status = 1;
        END IF;
    END;//
delimiter ;

delimiter //
CREATE TRIGGER table_test_insert_tr BEFORE INSERT ON table_test
    FOR EACH ROW
    BEGIN
        IF NEW.value < 0 THEN
            SET NEW.status = 2;
        ELSE
            SET NEW.status = 1;
        END IF;
    END;//
delimiter ;

编辑:
话虽如此,如果status始终应根据value计算,也许它不应该是表格中的列 - 相反,您可以创建一个视图来显示它。

CREATE TABLE table_test (
    id INT,
    detail TEXT,
    value INT DEFAULT 1
);

CREATE VIEW view_test AS
SELECT id, 
       detail, 
       value, 
       CASE value WHEN 1 THEN 1 ELSE 2 END AS status
FROM   test_table;

答案 1 :(得分:1)

使用case

UPDATE  table_test
SET     STATUS =
        CASE
        WHEN VALUE < 1 THEN 2
        ELSE 1
        END

答案 2 :(得分:0)

您需要在UPDATE和INSERT上创建TRIGGER

DELIMITER $$
CREATE
    TRIGGER `Ins_test_table` AFTER INSERT
    ON `test_table`
    FOR EACH ROW BEGIN 
    IF (VALUE < 1) THEN
    SET STATUS = 2;
    ELSE SET STATUS = 1;
    END IF;
    END$$ 

  CREATE
    TRIGGER `Update_test_table` AFTER UPDATE
    ON `test_table`
    FOR EACH ROW BEGIN 
    IF (VALUE < 1) THEN
    SET STATUS = 2;
    ELSE SET STATUS = 1;
    END IF;
    END$$ 

DELIMITER;

如果你可以运行其他MYSQL查询 - 你可以运行这个查询。

UPDATE test_table
SET STATUS = IF (VALUE < 1, 2, 1)

但它在所有桌面上都是最大的负荷。