2016-11-24 73 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);