MySQL信号复制密钥错误
我有一个表,其中包括一个枚举字段。我希望ENUM的特定值要求引用ID列具有唯一性。假设我有这个:MySQL信号复制密钥错误,mysql,triggers,Mysql,Triggers,我有一个表,其中包括一个枚举字段。我希望ENUM的特定值要求引用ID列具有唯一性。假设我有这个: `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `type` ENUM('single','multi') NOT NULL, `refid` INT UNSIGNED NOT NULL, `extra` TEXT, PRIMARY KEY (`id`) 我希望(type,refid)是唯一键,但前提是type是single。这不能用传统的键来完成,所以我想我
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`type` ENUM('single','multi') NOT NULL,
`refid` INT UNSIGNED NOT NULL,
`extra` TEXT,
PRIMARY KEY (`id`)
我希望(type,refid)
是唯一键,但前提是type
是single
。这不能用传统的键来完成,所以我想我应该使用触发器来检测行的插入,检查是否type='single'
,查找带有type='single'和refid=new.refid
的行,如果发现重复输入错误,则抛出重复输入错误
我使用的是MySQL 5.5,所以我可以使用SIGNAL-SQLSTATE
。我是否可以使用此命令触发重复密钥错误,以便在重复密钥更新时处理查询的
部分,如果是,如何处理
作为替代,我可以更新触发器中的行并返回一般错误条件,但我认为在重复键更新中使用
会更好(或至少更直观)。请尝试在触发器下方。我不太擅长写触发器。我没有执行下面的代码。您可以将其用作原型
CREATE TRIGGER checkDuplicateEntry
BEFORE INSERT OR UPDATE OF type, ref_id ON employees
DECLARE @duplicateCount INT;
FOR EACH ROW
IF ( new.type <> 'single' )
BEGIN
@duplicateCount = count(*) from yourTableName where type = 'single' AND refid = new.refid
END;
IF ( duplicateCount > 0 )
BEGIN
SIGNAL SQLSTATE VALUE '99999'
SET MESSAGE_TEXT = 'Duplicate Entry';
END
创建触发器检查重复项
在插入或更新类型之前,请参考员工id
声明@duplicateCount INT;
每行
如果(新的.type“single”)
开始
@duplicateCount=count(*)来自您的TableName,其中type='single'和refid=new.refid
结束;
如果(重复计数>0)
开始
信号SQLSTATE值“99999”
设置消息_TEXT='重复条目';
结束
替换为
。德普!忘了这一切。我不认为这会在重复密钥更新时触发
这会在更新和插入之前运行。我认为不会。事实上,这将触发语法错误。如果我没弄错的话,请重复两遍。事实上,我不擅长编写触发器:)。我只是想给出一些逻辑。我无意中发现了这一点,因为我正试图实现同样的目标(创建一个MySQL触发器,该触发器与INSERT…ON DUPLICATE KEY UPDATE
…一起工作,只是要小心,语义上REPLACE-INTO
是不同的:REPLACE-INTO
执行DELETE
然后执行INSERT
,其中INSERT…ON DUPLICATE KEY KEY KEY UPDATE
执行更新
…如果您有insert/update/delete触发器已定义,您可能会发现执行的触发器不是您想要的。。。