mysql对于多列是唯一的

时间:2015-11-20 06:55:08

标签: php mysql

付款时,有时会在表格中捕获双重条目。 我想忽略双重条目捕获,因此我想在这些createduser_idamount字段唯一时插入记录。 我怎么做到的?以下是我的表格。

CREATE TABLE `transactions` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`user_id` int(20) NOT NULL,
`project_id` int(20) DEFAULT NULL,
`foreign_id` int(20) NOT NULL,
`class` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`transaction_type_id` int(20) DEFAULT NULL,
`amount` float(10,2) NOT NULL,
`description` text COLLATE utf8_unicode_ci,
`payment_gateway_id` int(20) DEFAULT NULL,
`gateway_fees` float(10,2) NOT NULL,
`is_old` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=266 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2 个答案:

答案 0 :(得分:3)

要严格回答您的问题,请在这3列的组合上创建唯一的复合键。这样,在复合索引中它们中的3个组合就不存在两行。

CREATE TABLE `transactions2` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`user_id` int(20) NOT NULL,
`project_id` int(20) DEFAULT NULL,
`foreign_id` int(20) NOT NULL,
`class` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`transaction_type_id` int(20) DEFAULT NULL,
`amount` float(10,2) NOT NULL,
`description` text COLLATE utf8_unicode_ci,
`payment_gateway_id` int(20) DEFAULT NULL,
`gateway_fees` float(10,2) NOT NULL,
`is_old` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
unique key(created,user_id,amount) -- <------------------- right here
);

插入一些数据进行测试:

insert transactions2 (created,modified,user_id,project_id,foreign_id,class,
transaction_type_id,amount,description,payment_gateway_id,gateway_fees,is_old) values
('2009-01-01 12:00:00','2009-01-01 12:00:00',666,1,1,'a',1,100,'desc',1,12,1);

- 插入精细(上图)

使用完全相同的数据再次尝试:

insert transactions2 (created,modified,user_id,project_id,foreign_id,class,
transaction_type_id,amount,description,payment_gateway_id,gateway_fees,is_old) values
('2009-01-01 12:00:00','2009-01-01 12:00:00',666,1,1,'a',1,100,'desc',1,12,1);

- 错误1062:重复条目

- 勉强改变它:

insert transactions2 (created,modified,user_id,project_id,foreign_id,class,
transaction_type_id,amount,description,payment_gateway_id,gateway_fees,is_old) values
('2009-01-01 13:00:00','2009-01-01 12:00:00',666,1,1,'a',1,100,'desc',1,12,1);

- 插入正常

另外,使用ENGINE=INNODB。阅读Here

请阅读Mysql multi column indexes a.k.a.复合索引。

最后,你所谈论的概念离Insert on Duplicate Key Update并不远。只是为你抛出那个参考。

答案 1 :(得分:0)

您可以实现相同的使用,插入时的处理,

您可以使用WHERE NOT EXISTS尝试INSERT

这样的事情。(您需要指定具有NOT NULL约束的列名,我错过了所有这些列)

INSERT INTO table_name(`created`,`user_id`,`amount`) VALUES =
     '$created','$user_id','$amount'
    WHERE NOT EXISTS
    (SELECT * 
        FROM table_name 
           WHERE created ='$created' AND user_id='$user_id' AND amount='$amount')

希望这有帮助。