как реализовать ограничение в таблице, чтобы вставленные значения не повторялись только для группы строк - PullRequest
0 голосов
/ 08 апреля 2011

Мне нужно построить таблицу со столбцами

col1 (первичный ключ) col2 (не ноль) col3 (не ноль) col4 (не ноль)

Теперь мне нужно вставить значения в эту таблицу таким образом, чтобы значения, вставленные в col3, не повторялись для набора значений в col2 .... Какие ограничения необходимо реализовать ?? ...

Значения могут повторяться в col3 в целом ... Но для некоторого набора значений значений col2 в col3 повторяться не нужно.Так что это имя столбца.
ID ID_Category Keywords Score

Значения в столбце Keywords могут повторяться - но для некоторых значений в ID_Category, Keywords значения не должны повторяться.Можете ли вы помочь мне, как реализовать это ??

1 Ответ

1 голос
/ 08 апреля 2011

Использование кода от 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 ;
...