在 MySQL 中自定义主键
Customize primary key in MySQL
如何在 MySQL 中创建自定义主键?例如,我有 table 并且 table 名称是 X
,我有一个 table字段为 ID
、Code
、Name
.
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))
我没有尝试过这段代码,但我的观点是:
- 用户插入
- 在插入之前我检查最后一个主
- IF Null then i set 0, else i cut the symbol (-) and take the last part
- 我递增(使用[+1])
- 最后,我连接
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
如何在 MySQL 中创建自定义主键?例如,我有 table 并且 table 名称是 X
,我有一个 table字段为 ID
、Code
、Name
.
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))
我没有尝试过这段代码,但我的观点是:
- 用户插入
- 在插入之前我检查最后一个主
- IF Null then i set 0, else i cut the symbol (-) and take the last part
- 我递增(使用[+1])
- 最后,我连接
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