首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MySQL插入和更新转换为Server触发器

将MySQL插入和更新转换为Server触发器
EN

Stack Overflow用户
提问于 2012-06-18 16:41:27
回答 1查看 466关注 0票数 2

我有一个关系表,其中两个外键指向同一个表。

第一个外键列应该始终是一个外部属性的最小值,第二个是最大值。

我是Server的新手,我读到应该使用使用inserted临时表的插入,但是我应该如何设置最小和最大的关系子程序,而不是使用循环来迭代inserted条目。

表:

代码语言:javascript
复制
table Child
{
    int id;

    int value;
}

table Parent    
{
    int id;

    // foreign-keys A enforce minimum child value!
    int childA;
    int childB;
}

MySql触发器

代码语言:javascript
复制
CREATE TRIGGER parent_beforeInsert
BEFORE INSERT ON Parent
    FOR each ROW
    BEGIN
        DECLARE childAValue AS INT;
        DECLARE childBValue AS INT;

        SET childAValue = (SELECT value FROM Child WHERE ID = NEW.childA);
        SET childBValue = (SELECT value FROM Child WHERE ID = NEW.childB);

        -- only check if b > a since reverse is wished behavior
        IF childBValue > childAValue
        BEGIN
            -- swap values              
            DECLARE newChildA AS INT = NEW.childA
            SET NEW.childA = NEW.childB;
            SET NEW.childB = newChildA;
        END;
    END;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-29 14:53:19

使用条件选择查询解决它。不太优雅,特别是当许多属性需要设置,但它的工作。

代码语言:javascript
复制
INSERT INTO Parent (childA_ID, childB_ID) 
    SELECT CASE WHEN childA.value <= childB.value THEN childA.ID ELSE childB.ID END AS childA_ID,
            CASE WHEN childA.value > childB.value THEN childA.ID ELSE childB.ID END AS childB_ID
        FROM inserted AS p, 
            Child AS childA, 
            Child AS childB,
        WHERE childA.ID = p.childA 
            AND childB.ID = p.childB;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11087305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档