我已经看到类似的问题了,但是似乎没有任何东西可以完全适应这种情况。
我有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”错误,或者它没有插入记录。答案 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在主帐户表中不存在,但我仍然觉得编码方式正确,即使在简单的要求中也可以构建一个良好的平台一个应用程序,以后扩展,变得非常复杂,最小的问题维护成本。