我有一个表,其中主键是复合键: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是复合键的一部分。将这两个表连接在一起的最佳方法是什么,或者我应该保持原样?
答案 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;