在SQL中实现一对一关系而不共享PK?

时间:2015-04-11 18:55:53

标签: sql oracle

我想在数据库中的两个表之间定义一对一的关系,让我们说人和地址。

CREATE TABLE Person (
  pid INT PRIMARY KEY,
  name VARCHAR(20),
  occupation VARCHAR(20));

CREATE TABLE Address (
  street VARCHAR(30) PRIMARY KEY,
  city VARCHAR(10),
  state VARCHAR(2),
  zip VARCHAR(5));

我想链接这两个,以便每个人只有一个地址,每个地址只有一个人住在那里(这是一个简化的例子)。

我发现大多数解决方案都建议让两个表共享一个主键,或者将地址PK更改为引用人员PK的FK。我不想这样做,因为我仍然希望街道和pid都是独一无二的。

我将如何接近这个?

2 个答案:

答案 0 :(得分:2)

您在Person上有一个唯一键,以及一个主键,地址的主键将引用该键。

答案 1 :(得分:1)

与@ DavidAldridge的建议相反,我将表格结构如下:

CREATE TABLE ADDRESS
  (ID_ADDRESS  NUMBER
     CONSTRAINT PK_ADDRESS
       PRIMARY KEY,
   ADDR1            VARCHAR2(100),
   ADDR2            VARCHAR2(100),
   CITY             VARCHAR2(100),
   STATE_ABBR       CHAR(2),
   POSTAL_CODE      VARCHAR2(9));

CREATE TABLE PERSON
  (ID_PERSON        NUMBER
     CONSTRAINT PK_PERSON
       PRIMARY KEY,
   ID_ADDRESS       NUMBER
     CONSTRAINT FK_PERSON_1
       REFERENCES ADDRESS (ID_ADDRESS)
     CONSTRAINT UQ_PERSON_1
       UNIQUE,
   FIRST_NAME       VARCHAR2(50) DEFAULT 'JENNIE',
   LAST_NAME        VARCHAR2(50),
   AGE              NUMBER,
   WEIGHT           NUMBER,
   PHONE            VARCHAR2(50) DEFAULT '867-5309');

(这里假设ID_ADDRESS和ID_PERSON将以某种方式填充唯一值 - 如果是我,我将在每个表的BEFORE INSERT触发器中执行此操作......)。

通过在PERSON.ID_ADDRESS上放置一个UNIQUE约束,你说只有一个人可以住在给定的地址。

希望这会给你一些想法。

分享并享受。