2017-09-25 103 views
0

如何在MySQL中创建自定义主键?例如我有表和表名是X,我有一个表字段为ID,Code,Name自定义MySQL中的主键

恐怕如果我有1000个用户,当他们一起输入将 结果破坏

,我想:

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" 

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

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

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

  1. 用户插入
  2. 插入之前我检查最后一个主
  3. 如果为null,然后我设置为0,否则我砍符号( - )并带走最后一部分
  4. 我增加(使用[+ 1])
  5. Final,i concat CODE和New Number。

我误导了吗?大声笑,如果真的,如何创建像这样的? (我认为)我们可以做到这一点,也许没有人知道这一点,MySQL中的人工智能如何完美地工作?

回答

0

除了将连字符串作为主键,您可以将代码和数字作为单独的字段存储,将它们一起用作主键,也可以将连字符串作为生成的列使用。这是怎么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)) 
+0

这是安全的?怎么知道这个安全的方法是什么? –

+0

@AbdulAzizAlBasyir我在发布答案之前测试了它,它工作正常。事实上,我会说它比你在问题中使用的方法更安全。 –

+0

好的。非常感谢您的回答,您在哪里尝试?我也想尝试一下,作为一个教训 –