2016-11-24 110 views
-1

我想添加一個外鍵給我的表,它給了我一個錯誤,引用有相同的數據類型,有什麼想法?SQL錯誤150外鍵

這裏是我的代碼:

 CREATE TABLE order_task 
     (
     order_number numeric (20) NOT NULL , 
     order_sending_date TIMESTAMP, 
     order_profile_code varchar (20) NOT NULL , 
     order_weight decimal (20.10) NOT NULL , 
     order_piston_number numeric (1) NOT NULL 
    ); 
     ALTER TABLE order_task ADD CONSTRAINT ord_num_dt_pk PRIMARY KEY (order_number , order_sending_date); 

       CREATE TABLE pre_product 
     (
      pre_product_number numeric (5) NOT NULL , 
      pre_product_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP , 
      pre_product_lenght_count numeric (5) NOT NULL , 
      pre_product_rod_count numeric (5) NOT NULL, 
      pre_product_rod_lenght float (20) NOT NULL, 
      pre_product_weight float (20) NOT NULL, 
      pre_product_piston_number numeric (1) NOT NULL , 
      pre_product_profile_code varchar (20) NOT NULL , 
      pre_product_shift_number numeric (1) NOT NULL, 
      pre_product_employee varchar (40) NOT NULL , 
      pre_product_scrap float (20) NOT NULL, 
      pre_product_scrap_percentage float (3,3) NOT NULL , 
      pre_product_status varchar (40) NOT NULL, 
      pre_product_order_number numeric (20) NOT NULL , 
      pre_product_order_date TIMESTAMP 
     ); 
     ALTER TABLE pre_product ADD CONSTRAINT pp_num_date_pk PRIMARY KEY (pre_product_number,pre_product_date); 

     ALTER TABLE pre_product ADD CONSTRAINT pp_on_pp_fk FOREIGN KEY (pre_product_order_number) 
     REFERENCES order_task (order_number); 

     ALTER TABLE pre_product ADD CONSTRAINT pp_on_ot_fk FOREIGN KEY (pre_product_order_date) 
     REFERENCES order_task (order_sending_date); 

當我嘗試添加pre_product_order_date之間的外鍵和order_sending_date

+1

什麼是** exact **錯誤信息?你正在使用哪些DBMS?但是,在我知道的任何DBMS中,'decimal(20.10)'應該是'decimal(20,10)' –

+0

對於sql-server:'timestamp'不應該用於存儲日期。 「時間戳記數據類型只是一個遞增的數字,並不保存日期或時間。要記錄日期或時間,請使用日期時間數據類型。」請參閱:https://msdn.microsoft.com/en-us/library/ms182776(v=SQL.90).aspx。還有:「Transact-SQL時間戳數據類型與ISO標準中定義的時間戳數據類型不同。」 https://msdn.microsoft.com/en-us/library/ms182776(v=sql.130).aspx。最後:「時間戳語法已被棄用,此功能將在未來版本的Microsoft SQL Server中刪除。」 – HoneyBadger

+0

一個FK必須引用整個PK,在這個例子中是兩列。 – jarlh

回答

0

您已在表上創建的主鍵是兩列order_numberorder_sending_date複合主鍵。
所以,應該在兩個列上創建外鍵,而不僅僅是部分。由於pre_productorder_task表的子表。

ALTER TABLE pre_product 
    ADD CONSTRAINT pp_on_pp_fk FOREIGN KEY (pre_product_order_number_date) 
     REFERENCES order_task (order_number,order_sending_date); 
0
  • order_sending_date作爲PK的部分出現在最後一行的錯誤?看起來像一個糟糕的設計。
  • order_sending_date是definitly不是唯一的,所以如果你要定義一個FK你應該把它定義在兩列

    ALTER TABLE pre_product添加約束pp_on_pp__ot_fk外鍵(pre_product_order_number,pre_product_order_date) 參考order_task(ORDER_NUMBER,order_sending_date);