Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何创建具体的主键?_Mysql_Primary Key - Fatal编程技术网

Mysql 如何创建具体的主键?

Mysql 如何创建具体的主键?,mysql,primary-key,Mysql,Primary Key,您好,我是MySQL新手,但我想基于在另外两个表中创建的两个主键创建一个唯一的ID 以下是我们感兴趣的部分: CREATE TABLE patient( id_patient int NOT NULL AUTO_INCREMENT, ..., PRIMARY KEY (id_patient)) CREATE TABLE surgeon( id_surgeonint NOT NULL AUTO_INCREMENT, ..., PRIMARY KEY (id_surgeon)) CREATE T

您好,我是MySQL新手,但我想基于在另外两个表中创建的两个主键创建一个唯一的ID

以下是我们感兴趣的部分:

CREATE TABLE patient(
id_patient int NOT NULL AUTO_INCREMENT,
...,
PRIMARY KEY (id_patient))

CREATE TABLE surgeon(
id_surgeonint NOT NULL AUTO_INCREMENT,
...,
PRIMARY KEY (id_surgeon))

CREATE TABLE  case(
id_patient int NOT NULL,
id_surgeon int NOT NULL,
CONSTRAINT FK_case_patient FOREIGN KEY (id_patient) REFERENCES patient(id_patient),
CONSTRAINT FK_case_surgeon FOREIGN KEY (id_surgeon) REFERENCES surgeon(id_surgeon),
CONSTRAINT id_case PRIMARY KEY (id_patient, `_`,id_surgeon));
我想我不懂这个把戏。我希望得到以下结果:

SELECT * FROM case;

id_case  | id_patient | id_surgeon    
32_56    |     32     |     56
18_66    |     18     |     66

我知道计算速度不是最佳的,但是这个id案例是非常必要的,并且必须在select期间可见。您可以创建一个计算列,如果您真的想在磁盘上保存它的值,您可以保留计算列

CREATE TABLE  case(
id_patient int NOT NULL,
id_surgeon int NOT NULL,
id_case varchar(30) AS CONCAT(id_patient, '_', id_surgeon),
CONSTRAINT FK_case_patient FOREIGN KEY (id_patient) REFERENCES patient(id_patient),
CONSTRAINT FK_case_surgeon FOREIGN KEY (id_surgeon) REFERENCES surgeon(id_surgeon),
CONSTRAINT pk_case PRIMARY KEY (id_patient,id_surgeon));

然而,除非你有一对要求(病人,外科医生)唯一地识别一个病例,否则你应该考虑增加一个额外的字段(例如外科手术日期)

为什么不存储为2列并在选择过程中连接(作为一个虚拟列)?因为我们需要从数据库生成的所有文档中使用这个ID。将这个ID作为主键比每次都计算它更容易。但也许我错了,我不知道。。。如果我错了,你能告诉我为什么吗?你错了。您的目标是使
32_56
在选择过程中可见。您可以使用
选择CONCAT(id_患者,''.'id_外科医生)作为我的id
。如果您不想执行此“计算”,还可以使用与上述相同的
CONCAT
来更新列的触发器。您的主键应该是常规的自动增量。看到同一个病人以后可能会有同一个外科医生,在
病例表中结合
(id\u病人,id\u外科医生)
是一个不好的选择。