我有四个桌子
Processor_products
,其中包含列Name
和Socket
Motherboard
,其中包含列Name
和Socket
Build
,其中包含列Processor
(引用Processor_products(Name)
]和Motherboard
[引用Motherboard(Name)
] Compatibility
,其中包含列compatible
和id
如果要插入Build的处理器和主板具有不同的插槽,或者如果它们具有相同的插槽,则插入“是”。我想编写在Compatibilty.compatible中插入“否”的触发器。
CREATE TRIGGER compatibility
AFTER INSERT ON build
BEGIN
IF ((SELECT * FROM build WHERE ORDER BY ID DESC LIMIT 1) EXISTS (SELECT * FROM processor_products pp, motherboard m where pp.Socket <> m.Socket))
THEN
INSERT INTO compatibility(compatibility) VALUE('no');
ELSE
INSERT INTO compatibility(compatibility) VALUE('yes');
END IF;
END
我正在使用phpmyadmin,错误是我的语法错误。
1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以在'BEGIN附近使用正确的语法 IF((SELECT * FROM构建WHERE ORDER BY ID DESC LIMIT 1)存在(SELECT *'位于第3行
有人可以帮我吗?
表格:
Build table = https://i.stack.imgur.com/wxviV.png
Motherboard = https://i.stack.imgur.com/7YNAo.png
Processors = https://i.stack.imgur.com/HOVjU.png
答案 0 :(得分:1)
无需深入探讨语法问题;并且无需深入研究触发器要解决的实际问题;将所有讨论搁置一旁。
看起来触发器正在尝试:从socket
和motherboard
表中的相关行中检索“ processor
”列的值,然后比较这两个字符串值,然后根据比较结果执行其他操作。
注意:
请勿使用ORDER BY ... DESC LIMIT 1
标识刚刚插入的行。
在AFTER INSERT触发器的主体内,我们可以通过使用NEW
关键字限定列名来引用刚插入的行的值。
例如,在触发器中,对NEW.motherboard
和NEW.processor
的引用将分别返回该行的motherboard
和processor
列的值(分别)插入(通过导致触发触发器的语句/行)。
这是我们编写执行这些操作的AFTER INSERT触发器的方法的证明:
DELIMITER $$
CREATE TRIGGER `trg_build_ai`
AFTER INSERT ON `build`
FOR EACH ROW
BEGIN
-- local variables
DECLARE ls_compatiblity VARCHAR(4) DEFAULT NULL;
DECLARE ls_p_socket VARCHAR(1024) DEFAULT NULL;
DECLARE ls_m_socket VARCHAR(1024) DEFAULT NULL;
-- get "socket" values from motherboard and processor
SELECT m.socket AS m_socket
, p.socket AS p_socket
FROM ( SELECT 1 AS n ) i
LEFT
JOIN ( -- retrieve related motherboard "socket" value
SELECT ms.socket
FROM motherboard ms
WHERE ms.name = NEW.motherboard
ORDER BY ms.name, ms.socket
LIMIT 1
) m
LEFT
JOIN ( -- retrieve related processor "socket" value
SELECT ps.socket
FROM processor_product ps
WHERE ps.name = NEW.processor
ORDER BY ps.name, ps.socket
LIMIT 1
) p
INTO ls_m_socket
, ls_p_socket
;
-- check if values are equal
IF ( ls_m_socket = ls_p_socket ) THEN
SET ls_compatibility := 'yes';
ELSE
SET ls_compatibility := 'no';
END IF;
-- (not even going to try to fathom why we need to INSERT into another table)
INSERT INTO `compatibility` ( `compatibility` ) VALUES ( ls_compatibility );
END$$
DELIMITER ;