自定义MySQL中的主键

时间:2017-09-25 13:20:19

标签: mysql auto-increment

如何在MySQL中创建自定义主键?例如我有表,表名是X,我有一个表字段为IDCode,{{1} }。

  

我害怕如果我有1000个用户,当他们一起输入时   导致破坏

我希望:

Name

现在,我使用TRIGGER( BEFORE INSERT ),就像这样:

INSERT INTO `X` (`ID`,`Code`,`Name`) VALUES 
('P3K','Alex'), // this primary key is "P3K-1"
('SOS','Force'), // this primary key is "SOS-1"
('P3K','Bash'), // this primary key is "P3K-2"

我没有尝试这段代码,但我的观点是:

  1. 用户插入
  2. 在插入之前,我检查了LAST Primary
  3. IF Null然后我设置0,否则我剪切符号( - )并取最后一部分
  4. 我递增(使用[+ 1])
  5. 最后,我结束SET NEW.`ID` = CONCAT(NEW.`Code`,'-',IFNULL(SUBSTRING_INDEX(( SELECT `x`.`Code` FROM `X` WHERE X.`Code` = NEW.`Code` and ORDER BY X.`Code` DESC LIMIT 1 ),'-',-1),0) + 1)) 和新号码。
  6. 我是误入歧途吗?大声笑,如果是真的,如何创建像这样的? (我认为)我们可以做到并且可能没有人知道这一点,MySQL中的AI如何运作如此完美?

2 个答案:

答案 0 :(得分:1)

回答他(https://stackoverflow.com/users/1133682/mjh

InnoDB非常依赖于使用自动增量的PRIMARY KEY,如果你不使用自动增量,那么你将花费空间。每行添加至少6-8个字节只是为了制作“HIDDEN PRIMARY KEY”,并且最好使用innoDB是USE Auto Incremment并且不要打扰那个键,如果你想添加UNIQUE KEY那么你只需要CONCAT

答案 1 :(得分:-1)

您可以将代码和数字存储为单独的字段,将它们一起用作主键,并可选择将带连字符的字符串作为生成列,而不是将带连字符的字符串作为主键。这就是CREATE TABLE寻找这样一个表的方式

CREATE TABLE X (
    Code       CHAR(3),
    Number     INT,
    Name       VARCHAR(20),
    CodeNumber VARCHAR(8) AS (CONCAT(Code, '-', Number)),

    PRIMARY KEY (Code, Number)
);

然后你BEFORE INSERT触发器变为

SET NEW.Number = (1 + IFNULL((SELECT Number FROM X WHERE Code = NEW.Code 
                                     ORDER BY Number DESC LIMIT 1), 0))