我想在我的表中添加一个外键并且它给我一个错误,引用具有相同的数据类型,任何想法?
这是我的代码:
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之间添加外键时,错误出现在最后一行
答案 0 :(得分:0)
order_sending_date
作为PK的一部分?看起来像一个糟糕的设计。 order_sending_date
绝对不是唯一的,所以如果你想定义一个FK,你应该在两个列上定义它
ALTER TABLE pre_product ADD CONSTRAINT pp_on_pp__ot_fk FOREIGN KEY(pre_product_order_number,pre_product_order_date) 参考order_task(order_number,order_sending_date);
答案 1 :(得分:0)
您在表格上创建的主键是两列order_number
和order_sending_date
上的复合主键。
因此,应该在两个列上创建外键,而不仅仅是其中的一部分。由于pre_product
是order_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);