Как сделать MySQL table primary key auto increment с некоторым префиксом
у меня есть таблица, как этот
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');
результат будет такой же, как и другой ответ, но разница в том, что вы будете не нужно создавать другую таблицу или спровоцировать. Я надеюсь, что смогу помочь кому-то, у кого такой же случай, как у меня.