0

列を持つテーブルを作成する必要があります

col1(主キー) col2(非 null) col3(非 null) col4(非 null)

ここで、col3 に挿入された値が col2 の一連の値に対して繰り返されないように、このテーブルに値を挿入する必要があります....実装する必要がある制約は何ですか??...

値は、全体として col3 で繰り返すことができます ...ただし、col2 の一部の値のセットについては、col3 の値を繰り返す必要はありません。これが列名です。
ID ID_Category Keywords Score

Keywords列 の値は繰り返すことができますが、 の一部の値についてはID_CategoryKeywords値を繰り返す必要はありません。これを実装する方法を教えてもらえますか??

4

1 に答える 1

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 ;
于 2011-04-08T09:45:56.567 に答える