Mam taki stół
table
id Varchar(45) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(30) NOT NULL,
Chcę zwiększyć pole identyfikatora, np. 'LHPL001','LHPL002','LHPL003'
… Itd. Co powinienem zrobić w tym celu? Proszę, daj mi znać w każdy możliwy sposób.
mysql
auto-increment
Vijay
źródło
źródło
Odpowiedzi:
Jeśli naprawdę tego potrzebujesz, możesz osiągnąć swój cel za pomocą oddzielnej tabeli do sekwencjonowania (jeśli nie masz nic przeciwko) i wyzwalacza.
Tabele
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) );
Teraz spust
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 ;
Następnie wystarczy wstawić wiersze do tabeli table1
INSERT INTO Table1 (name) VALUES ('Jhon'), ('Mark');
I będziesz mieć
Oto demo SQLFiddle
źródło
Utwórz tabelę z normalnym numerycznym identyfikatorem auto_increment, ale zdefiniuj ją za pomocą
ZEROFILL
lub użyj,LPAD
aby dodać zera podczas wybierania. NastępnieCONCAT
wartości, aby uzyskać zamierzone zachowanie. Przykład 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 | +---------+------+
Przykład 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 | +---------+------+
źródło
Wiem, że jest późno, ale chcę się tylko podzielić tym, co w tym celu zrobiłem. Nie mogę dodać kolejnej tabeli ani wyzwalacza, więc po wstawieniu muszę wygenerować je w jednym zapytaniu. Czy w Twoim przypadku możesz spróbować tego zapytania.
CREATE TABLE YOURTABLE( IDNUMBER VARCHAR(7) NOT NULL PRIMARY KEY, ENAME VARCHAR(30) not null );
Wykonaj selekcję i użyj tego zapytania wybierającego, a następnie zapisz parametr @IDNUMBER
(SELECT IFNULL (CONCAT('LHPL',LPAD( (SUBSTRING_INDEX (MAX(`IDNUMBER`), 'LHPL',-1) + 1), 5, '0')), 'LHPL001') AS 'IDNUMBER' FROM YOURTABLE ORDER BY `IDNUMBER` ASC)
A następnie Wstaw zapytanie będzie:
INSERT INTO YOURTABLE(IDNUMBER, ENAME) VALUES (@IDNUMBER, 'EMPLOYEE NAME');
Wynik będzie taki sam, jak w przypadku drugiej odpowiedzi, ale różnica polega na tym, że nie będziesz musiał tworzyć kolejnej tabeli ani wyzwalacza. Mam nadzieję, że mogę pomóc komuś, kto ma taki sam przypadek jak mój.
źródło
Oto przykład PostgreSQL bez wyzwalacza, jeśli ktoś potrzebuje go na PostgreSQL:
CREATE SEQUENCE messages_seq; CREATE TABLE IF NOT EXISTS messages ( id CHAR(20) NOT NULL DEFAULT ('message_' || nextval('messages_seq')), name CHAR(30) NOT NULL, ); ALTER SEQUENCE messages_seq OWNED BY messages.id;
źródło