0

我见过与我类似的问题,但似乎没有什么完全适合这种情况。

我有 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$$

根据我在其他地方读到的内容,我的选项似乎是在重复密钥更新或插入忽略,这两个我似乎都无法工作,我也找不到涉及插入、选择、来自和何处的示例。

我错过了什么?

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

4

1 回答 1

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 应用程序,您应该拥有账单的类方法 save(),它应该检查相同的内容并使用 accounts 表的类将值插入到 accounts 表中,然后将行插入到账单表。使用这种方法可以真正实现现代复杂的逻辑,例如,如果您从帐单插入调用的帐户类方法发送回拒绝响应,您可以限制特定帐户的帐单插入。

于 2013-04-05T18:14:41.423 回答