SQL数据库-PK和FK';s
这已经是我的代码了,这是基于模板的,但我的不起作用,出现了关于太多主键和alter表缺少关键字的错误 我甚至不知道从哪里开始。如果我尝试插入任何数据,那么这也会导致丢失表达式的错误SQL数据库-PK和FK';s,sql,database,oracle,foreign-keys,primary-key,Sql,Database,Oracle,Foreign Keys,Primary Key,这已经是我的代码了,这是基于模板的,但我的不起作用,出现了关于太多主键和alter表缺少关键字的错误 我甚至不知道从哪里开始。如果我尝试插入任何数据,那么这也会导致丢失表达式的错误 CREATE TABLE staff ( staff_id INTEGER NOT NULL PRIMARY KEY, staff_name VARCHAR (30) NOT NULL, staff_surname VARCHAR (30) NOT NULL,
CREATE TABLE staff
(
staff_id INTEGER NOT NULL PRIMARY KEY,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL,
CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);
CREATE TABLE property
(
property_id INTEGER NOT NULL PRIMARY KEY,
owner_id INTEGER NOT NULL,
property_addressln1 VARCHAR (50) NOT NULL,
property_addressln2 VARCHAR (50) NOT NULL,
property_county VARCHAR (26) NOT NULL,
property_postcode VARCHAR (7) NOT NULL,
property_type VARCHAR (15) NOT NULL,
property_bedrooms INTEGER NOT NULL,
availability VARCHAR (15) NOT NULL,
valuation INTEGER NOT NULL,
fk1_owner_id INTEGER NOT NULL,
fk2_staff_id INTEGER NOT NULL,
fk3_client_id INTEGER NOT NULL,
CONSTRAINT pk_property PRIMARY KEY (property_id, fk1_owner_id)
);
CREATE TABLE owner
(
owner_id INTEGER NOT NULL PRIMARY KEY,
owner_name VARCHAR (30) NOT NULL,
owner_surname VARCHAR (30) NOT NULL,
owner_addressln1 VARCHAR (50) NOT NULL,
owner_addressln2 VARCHAR (50) NOT NULL,
owner_county VARCHAR (26) NOT NULL,
owner_postcode VARCHAR (7) NOT NULL,
owner_contactno INTEGER NOT NULL,
owner_email VARCHAR (50) NOT NULL UNIQUE,
CONSTRAINT pk_owner PRIMARY KEY (owner_id)
);
CREATE TABLE client
(
client_id INTEGER NOT NULL PRIMARY KEY,
client_name VARCHAR (30) NOT NULL,
client_surname VARCHAR (30) NOT NULL,
client_contactno INTEGER NOT NULL,
client_email VARCHAR (50) NOT NULL,
CONSTRAINT pk_client PRIMARY KEY (client_id)
);
ALTER TABLE property ADD CONSTRAINT fk1_property_to_owner FOREIGN KEY(fk1_owner_id) REFERENCES owner(owner_id) ON DELETE restrict on update cascade;
ALTER TABLE property ADD CONSTRAINT fk2_property_to_staff FOREIGN KEY(fk2_staff_id) REFERENCES staff(staff_id) ON DELETE restrict on update cascade;
ALTER TABLE property ADD CONSTRAINT
fk3_property_to_client FOREIGN KEY(fk3_client_id) REFERENCES client(client_id) ON DELETE restrict on update cascade;
一个表只能有一个主键。您尝试创建2个 第一:
Staff\u id INTEGER非空主键,
第二:CONSTRAINT pk\u STAFF主键(STAFF\u id)
当然,使用相同的列,但dbms不会对此进行检查
在每个表的第一行之后删除主键,它就会工作:
CREATE TABLE staff
(
staff_id INTEGER NOT NULL,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "STAFF".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);
接下来,ORACLE不支持删除限制上的
最后一点是,主键不应更改,因此更新时没有意义
CREATE TABLE STAFF(
Staff_id INTEGER NOT NULL PRIMARY KEY,
Staff_name VARCHAR(30) NOT NULL,
Staff_surname VARCHAR(30) NOT NULL,
Branch VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "STAFF".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_STAFF PRIMARY KEY (Staff_id)
);
您已经被描述为主键,不应该在查询中添加约束。正确的查询是
CREATE TABLE STAFF(
Staff_id INTEGER NOT NULL PRIMARY KEY,
Staff_name VARCHAR(30) NOT NULL,
Staff_surname VARCHAR(30) NOT NULL,
Branch VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL
);
或
关于创建表
,您不能将PK同时作为内联和约束来执行:
CREATE TABLE STAFF
(
Staff_id INTEGER NOT NULL ,
Staff_name VARCHAR(30) NOT NULL,
Staff_surname VARCHAR(30) NOT NULL,
Branch VARCHAR(10) NOT NULL,
JobRole VARCHAR(15) NOT NULL,
Staff_contactno INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "STAFF".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_STAFF PRIMARY KEY(Staff_id)
);
CREATE TABLE PROPERTY
(
Property_id INTEGER NOT NULL,
Owner_id INTEGER NOT NULL,
Property_addressLn1 VARCHAR(50) NOT NULL,
Property_addressLn2 VARCHAR(50) NOT NULL,
Property_county VARCHAR(26) NOT NULL,
Property_postcode VARCHAR(7) NOT NULL,
Property_type VARCHAR(15) NOT NULL,
Property_bedrooms INTEGER NOT NULL,
Availability VARCHAR(15) NOT NULL,
Valuation INTEGER NOT NULL,
fk1_Owner_id INTEGER NOT NULL,
fk2_Staff_id INTEGER NOT NULL,
fk3_Client_id INTEGER NOT NULL,
-- Specify the PRIMARY KEY constraint for table "PROPERTY".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_PROPERTY PRIMARY KEY(Property_id, fk1_Owner_id)
);
CREATE TABLE OWNER
(
Owner_id INTEGER NOT NULL,
Owner_name VARCHAR(30) NOT NULL,
Owner_surname VARCHAR(30) NOT NULL,
Owner_addressLn1 VARCHAR(50) NOT NULL,
Owner_addressLn2 VARCHAR(50) NOT NULL,
Owner_county VARCHAR(26) NOT NULL,
Owner_postcode VARCHAR(7) NOT NULL,
Owner_contactno INTEGER NOT NULL,
Owner_email VARCHAR(50) NOT NULL UNIQUE,
-- Specify the PRIMARY KEY constraint for table "OWNER".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_OWNER PRIMARY KEY(Owner_id)
);
CREATE TABLE CLIENT
(
Client_id INTEGER NOT NULL,
Client_name VARCHAR(30) NOT NULL,
Client_surname VARCHAR(30) NOT NULL,
Client_contactno INTEGER NOT NULL,
Client_email VARCHAR(50) NOT NULL,
-- Specify the PRIMARY KEY constraint for table "CLIENT".
-- This indicates which attribute(s) uniquely identify each row of data.
CONSTRAINT pk_CLIENT PRIMARY KEY(Client_id)
);
关于ALTER
,Oracle不支持您尝试执行的操作,请参见您已为同一个表定义了列级和表级主键。这就是您获取太多主键错误的原因
试试这个
CREATE TABLE staff
(
staff_id INTEGER NOT NULL,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL,
CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);
CREATE TABLE owner
(
owner_id INTEGER NOT NULL,
owner_name VARCHAR (30) NOT NULL,
owner_surname VARCHAR (30) NOT NULL,
owner_addressln1 VARCHAR (50) NOT NULL,
owner_addressln2 VARCHAR (50) NOT NULL,
owner_county VARCHAR (26) NOT NULL,
owner_postcode VARCHAR (7) NOT NULL,
owner_contactno INTEGER NOT NULL,
owner_email VARCHAR (50) NOT NULL UNIQUE,
CONSTRAINT pk_owner PRIMARY KEY (owner_id)
);
CREATE TABLE client
(
client_id INTEGER NOT NULL,
client_name VARCHAR (30) NOT NULL,
client_surname VARCHAR (30) NOT NULL,
client_contactno INTEGER NOT NULL,
client_email VARCHAR (50) NOT NULL,
CONSTRAINT pk_client PRIMARY KEY (client_id)
);
CREATE TABLE property
(
property_id INTEGER NOT NULL,
owner_id INTEGER NOT NULL,
property_addressln1 VARCHAR (50) NOT NULL,
property_addressln2 VARCHAR (50) NOT NULL,
property_county VARCHAR (26) NOT NULL,
property_postcode VARCHAR (7) NOT NULL,
property_type VARCHAR (15) NOT NULL,
property_bedrooms INTEGER NOT NULL,
availability VARCHAR (15) NOT NULL,
valuation INTEGER NOT NULL,
fk1_owner_id INTEGER NOT NULL,
fk2_staff_id INTEGER NOT NULL,
fk3_client_id INTEGER NOT NULL,
CONSTRAINT pk_property PRIMARY KEY (property_id, fk1_owner_id),
CONSTRAINT fk1_property_to_owner FOREIGN KEY(fk1_owner_id) REFERENCES owner(owner_id) ON DELETE restrict on update cascade,
CONSTRAINT fk2_property_to_staff FOREIGN KEY(fk2_staff_id) REFERENCES staff(staff_id) ON DELETE restrict on update cascade,
CONSTRAINT fk3_property_to_client FOREIGN KEY(fk3_client_id) REFERENCES client(client_id) ON DELETE restrict on update cascade
);
注意:我不确定属性表中owner_id和fk1_owner_id列的用途。这似乎是重复的列。如果重复,请从属性表中删除所有者id列
每个表只能定义一次主键约束
如果您定义了一个主键,它将已经不为NULL
约束,无需多提
>让我们考虑表<代码>工作人员<代码> < /P>
(以下警告也适用于其他CREATE TABLE语句)
将其创建为:
CREATE TABLE staff
(
staff_id INTEGER PRIMARY KEY,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL
);
或作为:
CREATE TABLE staff
(
staff_id INTEGER,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL,
CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);
- 更新时没有名为
的选项
用于在中创建外键
甲骨文
- 是的,删除时有一个名为
的选项,用于在中创建外键
神谕
作为关于删除级联
或关于删除设置空
但是不关于删除限制
CREATE TABLE staff
(
staff_id INTEGER,
staff_name VARCHAR (30) NOT NULL,
staff_surname VARCHAR (30) NOT NULL,
branch VARCHAR (10) NOT NULL,
jobrole VARCHAR (15) NOT NULL,
staff_contactno INTEGER NOT NULL,
CONSTRAINT pk_staff PRIMARY KEY (staff_id)
);