Php 如何在表中实现约束,以便插入的值不会仅对一组行重复

Php 如何在表中实现约束,以便插入的值不会仅对一组行重复,php,mysql,mysql5,Php,Mysql,Mysql5,我必须构造一个包含列的表 col1(主键)col2(非空)col3(非空)col4(非空) 现在我需要在这个表中插入值,这样插入到col3中的值对于col2中的一组值不会重复…需要实现哪些约束 值可以作为一个整体在col3中重复…但是对于某些col2值集,col3中的值不需要重复。 这就是列名。 IDID\u类别关键词得分 关键字列中的值可以重复-但是对于ID\u类别中的某些值,关键字值不需要重复。 您能帮助我如何使用中的代码实现此功能吗 首先创建这个通用错误表 CREATE TABLE `Er

我必须构造一个包含列的表

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

现在我需要在这个表中插入值,这样插入到col3中的值对于col2中的一组值不会重复…需要实现哪些约束

值可以作为一个整体在col3中重复…但是对于某些col2值集,col3中的值不需要重复。 这就是列名。
ID
ID\u类别
关键词
得分

关键字
列中的值可以重复-但是对于
ID\u类别
中的某些值,
关键字
值不需要重复。 您能帮助我如何使用中的代码实现此功能吗

首先创建这个通用错误表

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 ;

如果这不是您需要的,请更具体地说,显示一些代码和您需要的结果。您所说的无需重复是什么意思?这意味着ID_CategoryAm的某些值是唯一的?我现在清楚了???我应该添加更多信息吗?括号中有哪些值?--------------new.ID_category in('list'、'of'、'special'、'categories'))你能解释一下这一行吗?----如果new.id\u category in('list','of','special','categories')如果你希望(category,keyword)在类别为A,B或C时是唯一的,那么你可以使用条件
如果new.id\u category in('A','B','C')
等。如果类别不在列表中,则不检查唯一性