98 votes

Comment faire pour que la clé primaire d'une table MySQL s'incrémente automatiquement avec un certain préfixe

J'ai un tableau comme celui-ci

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

Je veux incrémenter mon champ id comme suit 'LHPL001','LHPL002','LHPL003' ... etc. Que dois-je faire pour cela ? Veuillez me faire part de toute solution possible.

159voto

peterm Points 72466

Si vous en avez vraiment besoin, vous pouvez atteindre votre objectif à l'aide d'une table séparée pour le séquençage (si cela ne vous dérange pas) et d'un déclencheur.

Tableaux

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

Maintenant, le déclencheur

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 ;

Ensuite, il suffit d'insérer des lignes dans le tableau 1

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

Et vous aurez

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

Voici SQLFiddle Démonstration

23voto

Fluffy Points 6908

Créez une table avec un ID numérique normal d'auto-incrémentation, mais définissez-le avec ZEROFILL ou utiliser LPAD pour ajouter des zéros lors de la sélection. Puis CONCAT les valeurs pour obtenir le comportement souhaité. Exemple 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 |
+---------+------+

Exemple n° 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 |
+---------+------+

6voto

yhAm Points 403

Je sais qu'il est tard mais je veux juste partager ce que j'ai fait pour cela. Je ne suis pas autorisé à ajouter une autre table ou un autre déclencheur et je dois donc les générer dans une seule requête lors de l'insertion. Pour votre cas, pouvez-vous essayer cette requête.

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

Effectuez une sélection et utilisez cette requête de sélection et enregistrez-la dans le paramètre @IDNUMBER.

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

Et alors la requête d'insertion sera :

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

Le résultat sera le même que celui de l'autre réponse, mais la différence est que vous n'aurez pas besoin de créer une autre table ou un autre trigger. J'espère que je peux aider quelqu'un qui a le même cas que moi.

-1voto

Ildar Nasurlaev Points 57

Voici un exemple PostgreSQL sans trigger si quelqu'un en a besoin sur 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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X