外键关系问题

时间:2015-09-22 15:57:39

标签: sql-server constraints foreign-key-relationship

我有一个表,其中主键是复合键:P_ID和[YEAR]

// Should mark first 10 dates, but only marks the last date
  for ($i = 0; $i < 10; $i++) {
    dateInput = Date.parse(dates[$i]);
    $scope.events = [{
      date: dateInput,
      status: 'full'
    }];
  }

// This code will switch the dot to the date below
  $scope.events = [{
    date: Date.parse("Tuesday, September 22, 2015"),
    status: 'full'
  }];

和另一张表:

Table1
_______
P_ID  int
YEAR   nvarchar
FIELD1

在Table1中,P_ID不是唯一的,为了获得需要组合P_ID和Year的唯一记录。在表2中,唯一标识符将是P_ID和PDate字段的组合,其中PDate是每个月的第一天(例如:2015年9月1日),因此每个P_ID有12条记录。

这两个表都没有任何约束,所以我想在P_ID和Year上为Table1创建一个主键。对于Table2,我想让P_ID和PDate成为主键。现在问题是我无法在Table2中创建将其链接到Table1的外键,因为P_ID是复合键的一部分。将这两个表连接在一起的最佳方法是什么,或者我应该保持原样?

1 个答案:

答案 0 :(得分:0)

当然可以。以下代码在SQL Server 2008 r2上运行。

use tempdb;

CREATE TABLE T1 (
  P_ID int not null,
  Year char(4) not null,
  Field1 varchar(50) null
  );

ALTER TABLE T1 ADD CONSTRAINT PK_1 PRIMARY KEY (P_ID, Year);


CREATE TABLE T2 (
  P_ID int not null,
  PDate datetime not null,
  Year char(4) not null,
  Field2 varchar(50) null
  );

ALTER TABLE T2 ADD CONSTRAINT PK_2 PRIMARY KEY (P_ID, PDate);

ALTER TABLE T2 ADD CONSTRAINT FK_2_1 FOREIGN KEY (P_ID, Year)
    REFERENCES T1 (P_ID, Year);

GO


INSERT T1 VALUES (1, 2015, 'abc'); -- Will Succeed
INSERT T1 VALUES (2, 2015, 'bcd'); -- Will Succeed

INSERT T2 VALUES (1, '1/1/2015', 2015, 'xyz'); -- Will Succeed
INSERT T2 VALUES (3, '1/1/2015', 2015, 'xyz'); -- Will Fail

SELECT * FROM T1;
SELECT * FROM T2;