SQL:我的查询中出现错误 1064,我找不到原因
Posted
技术标签:
【中文标题】SQL:我的查询中出现错误 1064,我找不到原因【英文标题】:SQL : Error 1064 in my query, i cannot find why 【发布时间】:2020-01-20 11:26:05 【问题描述】:我有这个来创建触发器:
CREATE TRIGGER `create_account`
AFTER INSERT
ON
`Client`
FOR EACH ROW
BEGIN
SET
@lastID = (
SELECT C.idClient
FROM CLIENT as C
ORDER BY C.idClient
DESC
LIMIT 1
);
SET
@iban = ('FR1330010000019111679074293');
SELECT IF(
LENGTH(@iban) < 11,
CONCAT(
REPEAT('0', (11 - LENGTH(@iban))),
@iban
),
@iban = @iban
);
INSERT INTO `Compte`(`idCompte`,
`numeroCompte`,
`soldeCompte`,
`idClientCompte`,
`statusCompte`)
VALUES (NULL, @iban, '0', @lastId, '0');
END
mysql 还给我
1064 - 第 14 行 '' 附近的语法错误"
有人解释一下吗?
谢谢大家。我正在努力解决它。
【问题讨论】:
在尝试创建触发器之前您还记得您的DELIMITER
语句吗?
@Nick 是的“DELIMITER |”
您似乎缺少SELECT IF (LENGTH(@iban) < 11...
的FROM
子句
【参考方案1】:
你想要这样的东西吗? 如果是,那么附加信息:https://www.w3resource.com/mysql/control-flow-functions/if-function.php
IF 函数不需要 SELECT 子句。 我在这里测试过:TEST
CREATE TRIGGER `create_account`
AFTER INSERT
ON
`Client`
FOR EACH ROW
BEGIN
SET
@lastID = (
SELECT C.idClient
FROM Client C
ORDER BY C.idClient
DESC
LIMIT 1
);
SET
@iban = ('FR1330010000019111679074293');
set @iban = IF(
LENGTH(@iban) < 11,
CONCAT(
REPEAT('0', (11 - LENGTH(@iban))),
@iban
),
@iban
);
INSERT INTO Compte(idCompte,
numeroCompte,
soldeCompte,
idClientCompte,
statusCompte)
VALUES (NULL, @iban, '0', @lastId, '0');
END;
/
【讨论】:
好的,一切正常。谢谢大家!我很接近......但没有以正确的方式阅读文档! @FrenchyCoder 我不明白人们为什么要这样做。你的问题是Error 1064 in my query, i cannot find why
。我已经解决了你的错误。我不知道也无法知道您对这个触发器还有什么其他计划。我相信每个人都可以以更好的方式做一些事情,但也许您刚刚开始创建触发器...这不是一个问题...为什么您从我的答案中删除了正确答案?
我删除了什么?我不明白你的意思......是我在 *** 中唯一的第二个问题。也许我在这篇文章上做错了什么?
好的,我明白你的意思(左边的绿色 V),我再补充一次。我知道我不能将此添加到所有其他答案中!
是的,当您获得一些声望点时,您将能够对那些对您有一点帮助的答案进行投票。【参考方案2】:
你可以试试下面的sn-p,基本上你需要使用DELIMITER否则mysql会从第一个;
开始处理。此外,您不能在触发器中使用 select 语句,您应该始终使用 select into
,最后我认为您的 if
语句没有按预期工作,它总是返回 1。
DELIMITER $$
CREATE TRIGGER `create_account` AFTER INSERT ON `Client` FOR EACH ROW BEGIN
SELECT C.idClient into @lastID FROM Client as C ORDER BY C.idClient DESC LIMIT 1;
SELECT 'FR1330010000019111679074293' into @iban;
SELECT IF(
LENGTH(@iban) < 11,
CONCAT(
REPEAT('0', (11 - LENGTH(@iban))),
@iban
),
@iban = @iban
) into @iban;
INSERT INTO `Compte`(`idCompte`,
`numeroCompte`,
`soldeCompte`,
`idClientCompte`,
`statusCompte`)
VALUES (NULL, @iban, '0', @lastId, '0');
END$$
DELIMITER ;
【讨论】:
【参考方案3】:没有引用 new
的 INSERT
触发器非常可疑。
您的问题应该解释您要实现的逻辑,但我认为是:
CREATE TRIGGER `reate_account
AFTER INSERT ON Client
FOR EACH ROW
BEGIN
SET @iban = 'FR1330010000019111679074293';
INSERT INTO Compte (numeroCompte, soldeCompte, idClientCompte, statusCompte)
SELECT LPAD(@iban, 11, '0'), '0', new.idClient, '0'
FROM DUAL
WHERE LENGTH(@iban) < 11;
END;
您的触发器比必要的复杂得多。
【讨论】:
是的,我已经添加了 @lastId 的 new.idClient insted ...但是在这里发布了我的代码之后。但好点,谢谢! @FrenchyCoder 。 . .我很惊讶你不接受这个答案。对于您的问题,这是一个更简单的解决方案。以上是关于SQL:我的查询中出现错误 1064,我找不到原因的主要内容,如果未能解决你的问题,请参考以下文章
即使创建表的语法正确,我的 sql 中也会出现错误 1064
创建具有货币类型的表在 sql 中出现此错误:ERROR 1064 (42000) [重复]