创建表

时间:2012-02-28 22:53:10

标签: 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 key.

person_organization表中的键是否被视为外键或主键?我被困在如何创建这个表。尝试查看我的教科书但无法找到有关它的信息。我不知道它们是否应该是引用主键的外键,或者我是否应该这样做

CREATE TABLE person_organization(ssn NUMERIC(9), org_code VARCHAR(60));

任何建议都将不胜感激。

感谢。

5 个答案:

答案 0 :(得分:5)

简单的答案是他们都是。

ssn, org_code应该是person_organization的主键。

ssn应该是一个回到人的外键,org_code应该通过外键返回organization

要将自己与northpole's answer区分开来,我实际上并不同意代理键参数,在这种情况下似乎不需要它,因为它不会在其他地方使用。

不幸的是,针对多对多关系的这个(好的)解决方案的问题在于,通常需要在桌面上有两个唯一的密钥,ssn, org_code org_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 )
 );

在原始表创建脚本中,ssnnumeric(9)number(9)应为org_code。您可能需要考虑不限制此数据类型的大小。您还有varchar作为varchar2,这应该是{{1}}。

Tech on the Net是学习语法的非常好的资源。

答案 1 :(得分:1)

我建议将一个唯一的,自动递增的主键添加到PERSON_ORGANIZATION(称为po_id),以及ssn和org_code的两个FOREIGN键。如果你愿意,你也可以将这两个独特。根据我的经验,我喜欢几乎每个表都有自己的唯一/自动键(除非它是查找表或审计表(可能还有其他))。

答案 2 :(得分:0)

他们都是。

对于person_organization表,您将拥有一个由两列组成的复合主键。每个都是另一个表的外键。

对于正常的数据库设计,它们应该引用其他表中的主键,这些约束强制数据库中数据的有效性。

答案 3 :(得分:0)

它们是外键。

您已经列出“两列都是主键”但我不认为它们是。

该表没有主键。 这两个字段的组合肯定充当主键的代理,这样做可以确保条目是唯一标识的,因此可以作为唯一标识符一起使用,但有点不同。

我还建议添加一个单独的主键字段,以便与其他表的结构保持一致。与其他表一样,我建议始终使用id [my favorite]或tablename_id

答案 4 :(得分:0)

这是基本思路,您需要为每个字段提供正确的数据类型

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)