如何在表中实现约束,使得插入的值不会仅对行组重复

时间:2011-04-08 09:15:36

标签: php mysql mysql5

我必须构建一个包含列

的表

col1(主键)col2(非null)col3(非null)col4(非null)

现在我需要在这个表中插入值,这样插入col3的值不会重复col2中的值集....需要实现的约束是什么?...

值可以在col3中作为一个整体重复...但是对于col3中col2值的某些值集合,不需要重复。 所以这是列名。
ID ID_Category Keywords Score

Keywords列中的值可以重复 - 但对于ID_Category中的某些值,Keywords值不需要重复。 你能帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

使用http://forge.mysql.com/wiki/Triggers#Emulating_Check_Constraints

中的代码

首先创建此通用错误表

CREATE TABLE `Error` (                                                                                                         
      `ErrorGID` int(10) unsigned NOT NULL auto_increment,                                                                         
      `Message` varchar(128) default NULL,                                                                                         
      `Created` timestamp NOT NULL default CURRENT_TIMESTAMP 
      on update CURRENT_TIMESTAMP,                                          
      PRIMARY KEY (`ErrorGID`),                                                                                                   
      UNIQUE KEY `MessageIndex` (`Message`))
      ENGINE=MEMORY 
      DEFAULT CHARSET=latin1 
      ROW_FORMAT=FIXED 
      COMMENT='The Fail() procedure writes to this table twice to force a constraint failure.';

创建失败的通用函数

DELIMITER $$
DROP PROCEDURE IF EXISTS `Fail`$$
CREATE PROCEDURE `Fail`(_Message VARCHAR(128))
BEGIN
  INSERT INTO Error (Message) VALUES (_Message);
  INSERT INTO Error (Message) VALUES (_Message);
END$$
DELIMITER ;

现在您可以在任何表格上创建自定义约束,例如您的

DELIMITER $$
create trigger mytable_check before insert on test.mytable for each row
begin
 if new.id_category in ('list','of','special','categories')
    and exists
      (select * from mytable
       where id_category=new.id_category
         and keywords=new.keywords) then
    call fail(concat('id_category,keywords must be unique when id_category is: ',new.id_category));
 end if;
end $$
DELIMITER ;