如果id不重复,则在另一个表中插入记录的MySql触发器

时间:2013-04-05 16:29:38

标签: mysql database triggers

我已经看到类似的问题了,但是似乎没有任何东西可以完全适应这种情况。

我有2张桌子,账单和账户。

如果账单被推入账单表并且还没有账户,我想在账户表中创建一条记录。

我有:

 ...
    BEFORE INSERT ON bills
    FOR EACH ROW 
    BEGIN
        INSERT INTO accounts (id, field1, field2, field3, field4)
        SELECT accountID, 'value1', value2, value3, value4
        FROM bills
        WHERE ((SELECT LEFT(accountID, 5) = 'XXXXX' |
        (SELECT LEFT(accountID, 5) = 'XXXXX' |
        (SELECT LEFT(accountID, 5) = 'XXXXX' |
        (SELECT LEFT(accountID, 5) = 'XXXXX' |
        (SELECT LEFT(accountID, 5) = 'XXXXX')) &&
        accountID NOT IN (SELECT id from accounts); ## I know this line is not right
    END$$

从我在其他地方读到的内容我的选项似乎是ON DUPLICATE KEY UPDATE或INSERT IGNORE,我似乎都无法工作,也无法找到INSERT,SELECT,FROM和WHERE所涉及的示例

我错过了什么?

编辑:我可以让它插入记录,但根据我的尝试方式,我总是得到“重复ID”错误,或者它没有插入记录。

1 个答案:

答案 0 :(得分:1)

还没有在MySQL中编码很长一段时间,因此请原谅是否存在一些小的语法错误。但是,您将了解在以下代码中需要完成的工作:

before insert on bills
for each row
begin
  declare @li_cnt int;
  select count('') into @li_cnt from accounts where accounts.id_account = inserted.id_account;
  if @li_cnt = 0 then
    insert into accounts (id_account) values (inserted.id_account)
  end

end

但是,此类问题应在中间层应用程序服务器级别处理,而不是在数据库触发级别处理,其中应该实际执行严格策略而不遵守业务要求。所以在这方面,假设您的应用程序是一个PHP Web应用程序,您应该使用bill的类方法save(),它应该检查相同并使用accounts表的类在accounts表中插入值,然后在账单表。使用这种方法可以真正地制作现代复杂的逻辑,例如果您从帐单插入调用的帐户类方法发回拒绝响应,则可以限制特定帐户的帐单插入。虽然在插入帐单时需要简单地将数据插入到帐户表中,而帐户代码/ ID在主帐户表中不存在,但我仍然觉得编码方式正确,即使在简单的要求中也可以构建一个良好的平台一个应用程序,以后扩展,变得非常复杂,最小的问题维护成本。