SQL数据库-PK和FK';s

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,

这已经是我的代码了,这是基于模板的,但我的不起作用,出现了关于太多主键和alter表缺少关键字的错误

我甚至不知道从哪里开始。如果我尝试插入任何数据,那么这也会导致丢失表达式的错误

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)   
    );