[mysql] MySQL 테이블 기본 키를 일부 접두사로 자동 증가시키는 방법

이런 테이블이 있어요

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

'LHPL001','LHPL002','LHPL003'… 등과 같이 내 ID 필드를 늘리고 싶습니다 . 어떻게해야합니까? 가능한 방법을 알려주십시오.



답변

이것이 정말로 필요하다면 시퀀싱을위한 별도의 테이블과 트리거를 사용하여 목표를 달성 할 수 있습니다.

테이블

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

그리고 당신은

| 아이디 | 이름 |
------------------
| LHPL001 | Jhon |
| LHPL002 | 마크 |

다음은 SQLFiddle 데모입니다.


답변

일반 숫자 auto_increment ID로 테이블을 생성하지만으로 정의 ZEROFILL하거나 LPAD선택할 때 0을 추가 하는 데 사용 합니다. 그런 다음 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
);

선택을 수행하고이 선택 쿼리를 사용하고 @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');

결과는 다른 답변과 동일하지만 차이점은 다른 테이블이나 트리거를 만들 필요가 없다는 것입니다. 저와 같은 사건이있는 사람을 도울 수 있기를 바랍니다.


답변

다음은 PostgreSQL에서 누군가 필요한 경우 트리거가없는 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;


답변