Sql 创建表
假设您有以下数据库:Sql 创建表,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,假设您有以下数据库: Person(ssn NUMERIC(9), name VARCHAR(40), gender CHAR(1)), ssn is primary key Organization(org_code CHAR(4), budget INTEGER, org_name VARCHAR(60)), org_code is primary key Person_Organization(ssn, org_code), both columns are the primary k
Person(ssn NUMERIC(9), name VARCHAR(40), gender CHAR(1)), ssn is primary key
Organization(org_code CHAR(4), budget INTEGER, org_name VARCHAR(60)), org_code is primary key
Person_Organization(ssn, org_code), both columns are the primary key.
person_organization表中的键是外键还是主键?我被困在如何创建这个表上。我试过在我的课本上查找,但找不到相关信息。我不知道它们是否应该是引用主键的外键,或者我是否应该这样做
CREATE TABLE person_organization(ssn NUMERIC(9), org_code VARCHAR(60));
如有任何建议,将不胜感激
谢谢。我建议为PERSON\u ORGANIZATION(称为类似po\u id的东西)添加一个唯一的、自动递增的主键,以及ssn和Organg\u代码的两个外键。如果你想的话,你也可以让这两个独一无二。根据我的经验,我希望几乎每个表都有自己的唯一/自动键(除非是查找表或审计表(可能还有其他表)) 我建议为PERSON\u-ORGANIZATION(称为po\u id)添加一个唯一的、自动递增的主键,以及ssn和org\u代码的两个外键。如果你想的话,你也可以让这两个独一无二。根据我的经验,我希望几乎每个表都有自己的唯一/自动键(除非是查找表或审计表(可能还有其他表)) 简单的答案是他们都是
ssn,组织代码
应该是人员组织
的主键
ssn
应该是一个外键返回到个人中,org\u code
应该是一个外键返回到组织中
把我自己和代理键分开,我并不同意代理键的论点,在这种情况下,它似乎不需要,因为它不会在其他任何地方使用
不幸的是,这种(好的)多对多关系解决方案的问题在于,它通常需要在一个表上有两个唯一的键,ssn,org\u code>和org\u code,ssn
,并选择一个作为主键
当您使用Oracle时,create table语法将是
create table person_organization
( ssn number(9)
, org_code varchar2(60)
, constraint person_organization_pk primary key (ssn, org_code)
, constraint person_organization_ssn_fk foreign key ( ssn )
references person ( ssn )
, constraint person_organization_oc_fk foreign key ( org_code )
references organization ( org_code )
);
在原始的表创建脚本中,您使用了ssn
作为numeric(9)
,它应该是number(9)
。您可能需要考虑不限制此数据类型的大小。您还有org\u code
作为varchar
,这可能是varchar2
是学习语法的一个很好的资源。简单的答案是两者都是
ssn,组织代码
应该是人员组织
的主键
ssn
应该是一个外键返回到个人中,org\u code
应该是一个外键返回到组织中
把我自己和代理键分开,我并不同意代理键的论点,在这种情况下,它似乎不需要,因为它不会在其他任何地方使用
不幸的是,这种(好的)多对多关系解决方案的问题在于,它通常需要在一个表上有两个唯一的键,ssn,org\u code>和org\u code,ssn
,并选择一个作为主键
当您使用Oracle时,create table语法将是
create table person_organization
( ssn number(9)
, org_code varchar2(60)
, constraint person_organization_pk primary key (ssn, org_code)
, constraint person_organization_ssn_fk foreign key ( ssn )
references person ( ssn )
, constraint person_organization_oc_fk foreign key ( org_code )
references organization ( org_code )
);
在原始的表创建脚本中,您使用了ssn
作为numeric(9)
,它应该是number(9)
。您可能需要考虑不限制此数据类型的大小。您还有org\u code
作为varchar
,这可能是varchar2
是学习语法的好资源。它们都是
对于person_organization表,您将有一个由两列组成的复合主键。每个表分别是另一个表的外键
对于正常的数据库设计,它们应该引用其他表中的主键,这些约束强制数据库中数据的有效性 他们都是
对于person_organization表,您将有一个由两列组成的复合主键。每个表分别是另一个表的外键
对于正常的数据库设计,它们应该引用其他表中的主键,这些约束强制数据库中数据的有效性 它们是外键
您列出了“两列都是主键”,但我认为它们不是
该表没有主键。
这两个字段的组合当然是作为主键的代理,做一些事情,比如确保条目被唯一标识,从而共同作为唯一标识符,但这有点不同
我还建议添加一个单独的主键字段,以与其他表的结构保持一致。与其他表一样,我建议始终使用id[我最喜欢的]或tablename\u id它们是外键
您列出了“两列都是主键”,但我认为它们不是
该表没有主键。
这两个字段的组合当然是作为主键的代理,做一些事情,比如确保条目被唯一标识,从而共同作为唯一标识符,但这有点不同
我还建议添加一个单独的主键字段,以与其他表的结构保持一致。与其他表一样,我建议始终使用id[my favorite]或tablename_id这是基本思想,您需要为每个字段提供适当的数据类型
CREATE TABLE Persons (
ssn int(9) NOT NULL PRIMARY KEY,
name varchar(40),
gender CHAR(1)
)
CREATE TABLE Organization (
org_code CHAR(4)NOT NULL PRIMARY KEY,
budget INTEGER,
org_name VARCHAR(60)
)
CREATE TABLE Person_Organization (
ssn int FOREIGN KEY REFERENCES Persons(ssn),
org_code CHAR FOREIGN KEY REFERENCES Organization(org_code)
)这是基本思想,您需要为每个字段提供适当的数据类型
CREATE TABLE Persons (
ssn int(9) NOT NULL PRIMARY KEY,
name varchar(40),
gender CHAR(1)
)
CREATE TABLE Organization (
org_code CHAR(4)NOT NULL PRIMARY KEY,
budget INTEGER,
org_name VARCHAR(60)
)
CREATE TABLE Person_Organization (
ssn int FOREIGN KEY REFERENCES Persons(ssn),
org_code CHAR FOREIGN KEY REFERENCES Organization(org_code)
)这就是我喜欢用自己的主键创建这些intersect表的部分原因。然后,您可以只保留另外两个外键作为多列唯一标识符。但两种方式都可以+1,可能是最常见的设计。@northpole,如果你不同意,那么绝对没有必要+1:-)。不,我一点也不反对,我只是做得有点不同。你的建议