ОШИБКА 1062 (23000): повторяющаяся запись DP1 для ключа PRIMARY.

У меня есть таблица distributor_warehouse, которая имеет автоматически увеличивающийся размер dpID. Я не могу вставить строку после вставки первой строки. Я видел подобные запросы, но везде были ответы, что столбец нужно автоматически увеличивать, что уже сделано в моем.

mysql> desc distributor_warehouse;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| dpID       | varchar(12)   | NO   | PRI |         |       |
| cpID       | varchar(12)   | YES  |     | NULL    |       |
| QTY        | int(6)        | YES  |     | NULL    |       |
| COST_PRICE | decimal(10,2) | YES  |     | NULL    |       |
| SELL_PRICE | decimal(10,2) | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

mysql> select * from distributor_warehouse;
+------+------+------+------------+------------+
| dpID | cpID | QTY  | COST_PRICE | SELL_PRICE |
+------+------+------+------------+------------+
| DP1  | CP5  |   10 |    3000.00 |    3100.00 |
+------+------+------+------------+------------+
1 row in set (0.00 sec)

mysql> INSERT INTO distributor_warehouse(cpID,QTY,COST_PRICE,SELL_PRICE) VALUES ('CP6',150,999,1500);
ERROR 1062 (23000): Duplicate entry 'DP1' for key 'PRIMARY'

dpID автоматически увеличивается с помощью триггера.

Это мой стол. Я успешно вставил строку 1, тогда при вставке строки 2 возникла проблема.

mysql> desc autoid;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| ID    | int(10) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)
| tg_distributor_warehouse_id | INSERT | distributor_warehouse | BEGIN
INSERT INTO autoid VALUES(NULL);
SET NEW.dpID = CONCAT('DP',LPAD(LAST_INSERT_ID(),1,''));
END |

person Avishek Datta Ray    schedule 08.10.2019    source источник
comment
тогда нам нужно увидеть код триггера.   -  person Barbaros Özhan    schedule 08.10.2019
comment
@ BarbarosÖzhan данный   -  person Avishek Datta Ray    schedule 08.10.2019
comment
В чем смысл этого триггера?   -  person Tim Biegeleisen    schedule 08.10.2019
comment
объединить строку DP со значением auto increment   -  person Avishek Datta Ray    schedule 08.10.2019
comment
Я предлагаю не этого делать. Если вы хотите отобразить DP, за которым следует какое-то значение автоматического увеличения, просто сделайте это при запросе.   -  person Tim Biegeleisen    schedule 08.10.2019
comment
вы можете привести пример?   -  person Avishek Datta Ray    schedule 08.10.2019
comment
По вопросам кода приведите минимальный воспроизводимый пример. Пожалуйста, уточняйте с помощью правок, а не комментариев.   -  person philipxy    schedule 08.10.2019
comment
@philipxy Я привел пример проблемы, с которой столкнулся.   -  person Avishek Datta Ray    schedule 08.10.2019
comment
Пожалуйста, укажите весь код в вашем вопросе, необходимый для вырезания, вставки и запуска. PS Значение LAST_INSERT_ID () равно 1, когда вы вставляете с ошибкой. Как вы думаете, почему было бы иначе? Если вы этого не сделаете, почему вы думаете, что DP1 можно снова вставить?   -  person philipxy    schedule 08.10.2019
comment
Я не могу воспроизвести вашу проблему, код у меня работает нормально.   -  person P.Salmon    schedule 08.10.2019
comment
@philipxy Я не хочу, чтобы DP1 снова вставлялся. Мне нужна новая строка с DP2 идентификатором объявления.   -  person Avishek Datta Ray    schedule 08.10.2019
comment
Так ответьте на мой другой вопрос. (Данные, которые вы предоставляете, уже имеют DP1. Вы четко объясняете? минимальный воспроизводимый пример)   -  person philipxy    schedule 08.10.2019


Ответы (1)


Ваш код в порядке

drop table if exists t,t1;
create table t(dpid varchar(12), cpid varchar(12), qty int,cost_price decimal(10,2),sell_price decimal(10,2));
create table t1(id int auto_increment primary key);

drop trigger if exists t;
delimiter$$
create trigger t before insert on t
for each row
begin
    insert into t1 values (null);
    SET NEW.dpID = CONCAT('DP',LPAD(LAST_INSERT_ID(),1,''));
end$$
delimiter;

INSERT INTO t(cpID,QTY,COST_PRICE,SELL_PRICE) VALUES ('CP6',150,999,1500);


INSERT INTO t(cpID,QTY,COST_PRICE,SELL_PRICE) VALUES ('CP6',150,999,1500);
select * from t;

+------+------+------+------------+------------+
| dpid | cpid | qty  | cost_price | sell_price |
+------+------+------+------------+------------+
| DP1  | CP6  |  150 |     999.00 |    1500.00 |
| DP2  | CP6  |  150 |     999.00 |    1500.00 |
+------+------+------+------------+------------+
2 rows in set (0.00 sec)
person P.Salmon    schedule 08.10.2019
comment
да, вот где у меня путаница, так же, как эта таблица, у меня есть другая таблица (точно такая же), которая полностью работает нормально - person Avishek Datta Ray; 08.10.2019
comment
Если мы не можем воспроизвести ошибку, мы мало что можем сделать. Вам нужно еще немного покопаться. - эта ошибка возникает при множественной вставке, есть ли какие-либо триггеры на autoid, работает ли что-либо еще с autoid, которое может вернуть идентификатор, эти вставки в транзакции, происходит ли откат на autoid как-то ... - person P.Salmon; 08.10.2019
comment
1. Эта ошибка возникает при множественной вставке, 2. да, на autoid есть 3 триггера (один я указал в сообщении, а другие 2 связаны с еще двумя таблицами), 3. не понял ваш вопрос, 4 . да это вставки в транзакцию, 5. не поняла ваш вопрос - person Avishek Datta Ray; 08.10.2019
comment
Единственный способ получить ошибку - это установить значение autoid обратно на 1 после первой вставки - вам придется пробираться через базу кода, чтобы увидеть, где это может произойти. - person P.Salmon; 08.10.2019