2015-11-20 4 views
1

Когда происходит платеж, иногда его фиксированная двойная запись в таблице. Я хочу игнорировать двойной захват записи, поэтому я хочу вставить записи, когда эти поля created, user_id, amount должны быть уникальными. Как это сделать? Ниже мой стол.mysql уникален для нескольких столбцов

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 
+0

Вы можете использовать 'GROUP BY created, user_id, amount' – madforstrength

+0

Посмотрите на использование ограничений таблицы. –

+0

Это невероятно маловероятно, что вам понадобится тип данных с плавающей точкой в ​​этой таблице – Strawberry

ответ

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. Просто бросьте эту ссылку туда для вас.

+0

Um, сумма обычно не составляла бы компонент PK – Strawberry

+0

Просто ответив строго, @Strawberry. Согласен. И это не PK – Drew

+0

Сохранение при вводе – Strawberry

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') 

Надеется, что это помогает.

+0

синтаксическая ошибка. Кроме того, у него есть «не нулевые» столбцы, которые вы игнорируете. Вы составляете синтаксис снова bro :) – Drew

Смежные вопросы