2016-08-12 71 views
2

我有這個模式日期期間has_table關鍵

-- Create tables section ----------------------------------------- 

-- Table t1 
CREATE TABLE "t1"(
"id" Serial NOT NULL, 
PRIMARY KEY ("id"); 

-- Table t2 
CREATE TABLE "t2"(
"id" Serial NOT NULL, 
PRIMARY KEY ("id"); 

-- Table t1_has_t2 
CREATE TABLE "t1_has_t2"(
"t1_id" Integer NOT NULL, 
"t2_id" Integer NOT NULL, 
"d_start" Date, 
"d_end" Date, 
PRIMARY KEY ("t1_id","t2_id"), 
FOREIGN KEY ("t1_id") REFERENCES "t1" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ("t2_id") REFERENCES "t2" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION); 

我需要使用保存T1或T2週期表「t1_has_t2」。例如,我要保存該記錄表「t1_has_t2」:

 
+-------+-------+------------+------------+ 
| t1_id | t2_id | d_start | d_end  | 
+-------+-------+------------+------------+ 
| 1  | 1  | 01-01-2016 | 31-01-2016 | 
+-------+-------+------------+------------+ 
| 1  | 1  | 01-02-2016 | 31-12-9999 | 
+-------+-------+------------+------------+ 

我不知道我該怎麼做我的數據庫,可以用相同的ID添加另一條記錄,如果日期時間段是不同的。

+1

你的主要關鍵是什麼是限制表只有一個ID對,你需要修改它以允許你問什麼。 – Uueerdo

回答

1

問題是表t1_has_t2中的主鍵只包含t1_idt2_id。您還應該在主鍵中包含其餘兩列以完成此項工作。順便提一句,如果您使用兩個日期,最好使用daterange列,因爲您可以使用EXCLUDE constraint&& operator輕鬆檢查重疊。

+0

使用daterange是完美的,但我使用PostgreSQL 9.1。在這個版本中不存在daterange數據類型。 https://www.postgresql.org/docs/9.1/static/datatype-datetime.html –