So erhöhen Sie die automatische Inkrementierung des Primärschlüssels der MySQL-Tabelle mit einem Präfix


80

Ich habe einen Tisch wie diesen

table
id Varchar(45) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(30) NOT NULL,

Ich möchte mein ID-Feld wie 'LHPL001','LHPL002','LHPL003'... usw. erhöhen. Was muss ich dafür tun? Bitte lassen Sie mich einen möglichen Weg wissen.


Fügen Sie dazu einfach eine weitere Spalte hinzu. Es ist völlig normal, "verschiedene Arten" von ID-Feldern in einer Datenbank zu haben.
Fattie

Antworten:


133

Wenn Sie dies wirklich brauchen, können Sie Ihr Ziel mit Hilfe einer separaten Tabelle für die Sequenzierung (wenn Sie nichts dagegen haben) und eines Auslösers erreichen.

Tabellen

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

Nun der Auslöser

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 ;

Dann fügen Sie einfach Zeilen in Tabelle1 ein

INSERT INTO Table1 (name) 
VALUES ('Jhon'), ('Mark');

Und du wirst haben

| ID | NAME |
------------------ ------------------.
| LHPL001 | Jhon |
| LHPL002 | Mark |

Hier ist die SQLFiddle- Demo


Ist die Aussage innerhalb des Triggers atomar? Das heißt, es ist möglich, dass zwischen INSERT und SET ein anderer Thread / eine andere Anforderung in table1_seq eingefügt wird, wodurch LAST_INSERT_ID () die ID der anderen Anforderung zurückgibt und nicht die, die in BEGIN / END eingefügt wurde.
n00b

@peterm, ich habe einen Zweifel Trigger Teil. Ich habe SET NEW.id = CONCAT geändert ('A', LPAD (LAST_INSERT_ID (), 4, '500')); weil ich meine ID brauche, beginne mit 5001, also setze ich 500. Also bekomme ich die Ausgabe A5001, die korrekt ist. Mein Zweifel ist, sobald die ID 5999 erreicht ist, was wird dann die nächste ID sein? Ist es 6000?
user9437856

Ich habe es selbst versucht, nachdem ich die Datensätze in die Datenbank aufgenommen habe. Ich habe mehr als 1000 Datensätze hinzugefügt und nach 5999 beginnt mein ID-Wert bei V1000, was völlig falsch ist. Ich brauche es sollte fortgesetzt werden 6000.6001.6002 und so weiter. Irgendeine Idee dazu?
user9437856

17

Erstellen Sie eine Tabelle mit einer normalen numerischen auto_increment-ID, definieren Sie sie jedoch entweder mit ZEROFILLoder LPADfügen Sie bei der Auswahl Nullen hinzu. Dann CONCATdie Werte, um Ihr beabsichtigtes Verhalten zu erhalten. Beispiel 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 |
+---------+------+

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

Ursprünglich dachte ich daran, die LHPL als separate Spalte zu speichern und sie dann durch concat (col1, col2) zu konkatieren, aber dann wird es ein Schmerz im S sein, wenn ich eines Tages die LHPL ändern muss. Ich denke, ich werde es auf der Seite des Programmservers tun.
4 Verlassen Sie die Abdeckung

3

Ich weiß, dass es spät ist, aber ich möchte nur mitteilen, was ich dafür getan habe. Ich darf keine weitere Tabelle oder keinen weiteren Trigger hinzufügen, daher muss ich diese beim Einfügen in einer einzigen Abfrage generieren. Können Sie diese Abfrage für Ihren Fall versuchen?

CREATE TABLE YOURTABLE(
IDNUMBER VARCHAR(7) NOT NULL PRIMARY KEY,
ENAME VARCHAR(30) not null
);

Führen Sie eine Auswahl durch, verwenden Sie diese Auswahlabfrage und speichern Sie sie im Parameter @IDNUMBER

(SELECT IFNULL
     (CONCAT('LHPL',LPAD(
       (SUBSTRING_INDEX
        (MAX(`IDNUMBER`), 'LHPL',-1) + 1), 5, '0')), 'LHPL001')
    AS 'IDNUMBER' FROM YOURTABLE ORDER BY `IDNUMBER` ASC)

Und dann lautet die Abfrage einfügen:

INSERT INTO YOURTABLE(IDNUMBER, ENAME) VALUES 
(@IDNUMBER, 'EMPLOYEE NAME');

Das Ergebnis ist das gleiche wie bei der anderen Antwort, aber der Unterschied besteht darin, dass Sie keine weitere Tabelle oder keinen anderen Trigger erstellen müssen. Ich hoffe, dass ich jemandem helfen kann, der den gleichen Fall wie ich hat.


0

Hier ist ein PostgreSQL-Beispiel ohne Trigger, wenn jemand es auf PostgreSQL benötigt:

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.