Как сделать первичный ключ таблицы MySQL автоматическим приращением с некоторым префиксом
у меня есть таблица, как этот
table
id Varchar(45) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(30) NOT NULL,
Я хочу увеличить мое поле id, как 'LHPL001','LHPL002','LHPL003'... так далее.
Что я должен сделать для этого? Пожалуйста, дайте мне знать любым возможным способом.
3 ответов:
Если вам это действительно нужно, вы можете достичь своей цели с помощью отдельной таблицы для секвенирования (если вы не возражаете) и триггера.
таблицы
CREATE TABLE table1_seq ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ); CREATE TABLE table1 ( id VARCHAR(7) NOT NULL PRIMARY KEY DEFAULT '0', name VARCHAR(30) );триггер
DELIMITER $$ CREATE TRIGGER tg_table1_insert BEFORE INSERT ON table1 FOR EACH ROW BEGIN INSERT INTO table1_seq VALUES (NULL); SET NEW.id = CONCAT('LHPL', LPAD(LAST_INSERT_ID(), 3, '0')); END$$ DELIMITER ;тогда вы просто вставляете строки в table1
INSERT INTO Table1 (name) VALUES ('Jhon'), ('Mark');и вы будете иметь
| ID | NAME | ------------------ | LHPL001 | Jhon | | LHPL002 | Mark |здесь SQLFiddle демо
создайте таблицу с обычным числовым идентификатором auto_increment, но либо определите ее с помощью
ZEROFILL, или использоватьLPADдля добавления нулей при выборе. ТогдаCONCATзначения, чтобы получить требуемое поведение. Пример #1:create table so ( id int(3) unsigned zerofill not null auto_increment primary key, name varchar(30) not null ); insert into so set name = 'John'; insert into so set name = 'Mark'; select concat('LHPL', id) as id, name from so; +---------+------+ | id | name | +---------+------+ | LHPL001 | John | | LHPL002 | Mark | +---------+------+Пример #2:
create table so ( id int unsigned not null auto_increment primary key, name varchar(30) not null ); insert into so set name = 'John'; insert into so set name = 'Mark'; select concat('LHPL', LPAD(id, 3, 0)) as id, name from so; +---------+------+ | id | name | +---------+------+ | LHPL001 | John | | LHPL002 | Mark | +---------+------+
Я знаю, что уже поздно, но я просто хочу поделиться тем, что я сделал для этого. Мне не разрешено добавлять другую таблицу или триггер, поэтому мне нужно создать ее в одном запросе при вставке. Для вашего случая, вы можете попробовать этот запрос.
CREATE TABLE YOURTABLE( IDNUMBER VARCHAR(7) NOT NULL PRIMARY KEY, ENAME VARCHAR(30) not null );выполните select и используйте этот запрос select и сохраните его в параметре @IDNUMBER
(SELECT IFNULL (CONCAT('LHPL',LPAD( (SUBSTRING_INDEX (MAX(`IDNUMBER`), 'LHPL',-1) + 1), 5, '0')), 'LHPL001') AS 'IDNUMBER' FROM YOURTABLE ORDER BY `IDNUMBER` ASC)и тогда вставить запрос будет:
INSERT INTO YOURTABLE(IDNUMBER, ENAME) VALUES (@IDNUMBER, 'EMPLOYEE NAME');результат будет такой же, как и другой ответ, но разница в том, что вы будете не нужно создавать другую таблицу или спровоцировать. Я надеюсь, что смогу помочь кому-то, у кого есть тот же случай, что и у меня.
Comments