在 MySQL 中自定义主键

Customize primary key in MySQL

如何在 MySQL 中创建自定义主键?例如,我有 table 并且 table 名称是 X,我有一个 table字段为 IDCodeName.

I am afraid if I have 1000 users and when they input together will result in destruction

我想:

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. IF Null then i set 0, else i cut the symbol (-) and take the last part
  4. 我递增(使用[+1])
  5. 最后,我连接 CODE 和新号码。

我被误导了吗?大声笑,如果是真的,如何创造这样的? (我认为) 我们可以做到,也许 没人知道,MySQL 中的 AI 如何工作得如此完美?

您可以将代码和数字存储为单独的字段,将它们一起用作主键,并可选择将带连字符的字符串作为生成列,而不是将带连字符的字符串作为主键。这就是 CREATE TABLE 寻找这样一个 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))

他的回答(https://whosebug.com/users/1133682/mjh)

InnoDB 非常依赖使用 Auto Increment 的 PRIMARY KEY,如果你不使用 Auto Increment 那么你将花费 space。每行添加至少 6-8 个字节只是为了 "HIDDEN PRIMARY KEY",innoDB 的最佳用途是使用自动增量并且不要打扰那个键,如果你想添加 UNIQUE KEY 那么你只需要 CONCAT