如何在MySQL中创建自定义主键?例如我有表,表名是X
,我有一个表字段为ID
,Code
,{{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"
我没有尝试这段代码,但我的观点是:
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))
和新号码。答案 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))