MySQL信号复制密钥错误

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。这不能用传统的键来完成,所以我想我

我有一个表,其中包括一个枚举字段。我希望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
。这不能用传统的键来完成,所以我想我应该使用触发器来检测行的插入,检查是否
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触发器已定义,您可能会发现执行的触发器不是您想要的。。。