Cách tạo khóa chính của bảng MySQL tự động tăng với một số tiền tố


80

Tôi có cái bàn như thế này

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

Tôi muốn tăng trường id của mình như 'LHPL001','LHPL002','LHPL003'... vv Tôi phải làm gì cho điều đó? Xin vui lòng cho tôi biết bất kỳ cách nào có thể.


chỉ cần thêm một cột khác để thực hiện việc này. hoàn toàn bình thường khi có "các loại" trường ID khác nhau trong cơ sở dữ liệu.
Fattie

Câu trả lời:


135

Nếu bạn thực sự cần điều này, bạn có thể đạt được mục tiêu của mình với sự trợ giúp của bảng riêng biệt để sắp xếp trình tự (nếu bạn không phiền) và một trình kích hoạt.

Những cái bàn

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

Bây giờ là trình kích hoạt

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 ;

Sau đó, bạn chỉ cần chèn các hàng vào table1

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

Và bạn sẽ có

| ID | TÊN |
------------------
| LHPL001 | Jhon |
| LHPL002 | Đánh dấu |

Đây là bản demo SQLFiddle


Câu lệnh có nằm trong nguyên tử kích hoạt không? Tức là có thể giữa INSERT và SET một luồng / yêu cầu khác chèn vào table1_seq khiến LAST_INSERT_ID () trả về id của yêu cầu khác và không phải là id đã được chèn trong BEGIN / END.
n00b

@peterm, tôi có một phần kích hoạt nghi ngờ. Tôi đã thay đổi SET NEW.id = CONCAT ('A', LPAD (LAST_INSERT_ID (), 4, '500')); vì tôi cần id của tôi bắt đầu từ 5001 nên tôi đặt 500. Vì vậy, tôi nhận được đầu ra A5001 là chính xác. Nghi ngờ của tôi là khi id đạt tới 5999 thì id tiếp theo sẽ là gì? Có phải là 6000 không?
user9437856

Tôi đã tự thử sau khi thêm các bản ghi trong cơ sở dữ liệu, tôi đã thêm hơn 1000 bản ghi và sau 5999 giá trị id của tôi bắt đầu từ V1000, điều này hoàn toàn sai. Tôi cần nó nên được tiếp tục 6000,6001,6002 và như vậy. bất kỳ ý tưởng trong này?
user9437856

18

Tạo bảng với ID auto_increment dạng số bình thường, nhưng xác định nó bằng ZEROFILLhoặc sử dụng LPADđể thêm các số 0 khi chọn. Sau đó, CONCATcác giá trị để có được hành vi dự định của bạn. Ví dụ 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 |
+---------+------+

Ví dụ # 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 |
+---------+------+

Ban đầu tôi đã nghĩ đến việc lưu trữ LHPL như một cột riêng biệt sau đó nối nó bằng concat (col1, col2) nhưng sau đó sẽ là một khó khăn trong S khi một ngày nào đó tôi cần thay đổi LHPL. Vì vậy, tôi đoán tôi sẽ làm điều đó ở phía máy chủ chương trình.
4 Rời khỏi Bìa

3

Tôi biết là muộn nhưng tôi chỉ muốn chia sẻ về những gì tôi đã làm được cho việc này. Tôi không được phép thêm một bảng hoặc trình kích hoạt khác, vì vậy tôi cần tạo nó trong một truy vấn duy nhất khi chèn. Đối với trường hợp của bạn, bạn có thể thử truy vấn này.

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

Thực hiện chọn và sử dụng truy vấn chọn này và lưu vào tham số @IDNUMBER

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

Và sau đó truy vấn Chèn sẽ là:

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

Kết quả sẽ giống với câu trả lời khác nhưng sự khác biệt là bạn sẽ không cần tạo một bảng hoặc kích hoạt khác. Tôi hy vọng rằng tôi có thể giúp một ai đó có trường hợp tương tự như tôi.


0

Đây là ví dụ về PostgreSQL không có trình kích hoạt nếu ai đó cần nó trên 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.