【问题标题】:SQL Foreign keys not auto incrementingSQL外键不自动递增
【发布时间】:2016-04-22 12:13:58
【问题描述】:

当我注释掉代码运行的每次外键调用时,正确创建表并用递增的 id 填充它们,但是当我在其中调用外键时,它会中断并且 id 保持为空

 CREATE TABLE CustomerDetails
(
    CustomerID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
    CONSTRAINT CustomerDetails_PK PRIMARY KEY,
    CustomerFirstName VARCHAR(15) NOT NULL,
    CustomerSurname VARCHAR(15) NOT NULL,
    ContactNumber VARCHAR(13) NOT NULL
);
INSERT INTO CustomerDetails(CustomerFirstName, CustomerSurname, ContactNumber) VALUES ('First', 'Last', '09998877665');
CREATE TABLE CinemaList
(
    CinemaID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
    CONSTRAINT CinemaList_PK PRIMARY KEY,
    CinemaName VARCHAR(10)
);
INSERT INTO CinemaList(CinemaName) VALUES ('England');
INSERT INTO CinemaList(CinemaName) VALUES ('Wales');
INSERT INTO CinemaList(CinemaName) VALUES ('Ireland');
CREATE TABLE FilmDetails
(
    FilmID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
    CONSTRAINT FilmDetails_PK PRIMARY KEY,

    FilmName VARCHAR(25),
    FilmInfo VARCHAR(250),
    CinemaList_CinemaID INT NOT NULL
);
ALTER TABLE FilmDetails ADD FOREIGN KEY (CinemaList_CinemaID) REFERENCES CinemaList(CinemaID);
INSERT INTO FilmDetails(FilmName, FilmInfo) VALUES ('Film1', 'Film1 Bio');
INSERT INTO FilmDetails(FilmName, FilmInfo) VALUES ('Film2', 'Film2 Bio');
CREATE TABLE FilmTimes
(
    TimeID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
    CONSTRAINT FilmTimes_PK PRIMARY KEY,
    FilmTime VARCHAR(5),
    FilmDetails_FilmID INT NOT NULL
);
ALTER TABLE FilmTimes ADD FOREIGN KEY (FilmDetails_FilmID) REFERENCES FilmDetails(FilmID);
INSERT INTO FilmTimes(FilmTime) VALUES ('11:00');
INSERT INTO FilmTimes(FilmTime) VALUES ('17:00');
INSERT INTO FilmTimes(FilmTime) VALUES ('21:00');
CREATE TABLE BookingDetails
(
BookingID INT NOT NULL
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
CONSTRAINT BookingDetails_PK PRIMARY KEY,
FilmTimes_TimeID INT NOT NULL,
CustomerDetails_CustomerID INT NOT NULL,
BookingDate DATE NOT NULL

);
ALTER TABLE BookingDetails ADD FOREIGN KEY (CustomerDetails_CustomerID) REFERENCES CustomerDetails(CustomerID);
ALTER TABLE BookingDetails ADD FOREIGN KEY (FilmTimes_TimeID) REFERENCES FilmTimes(TimeID);
INSERT INTO BookingDetails(BookingDate) VALUES ('2016-01-17');

【问题讨论】:

  • 看起来你需要重新思考一下 FilmTimes 和 FilmDetails 之间的关系。我看到您在没有提供外键值的情况下将值插入到 FilmDetails 中,外键具有 NOT NULL 约束(因此您必须为其提供非空值)。
  • 我正在尝试从 FilmTimes 调用 FilmTimeID 作为 FilmDetails 中的外键。我们需要那里的时间,而不是空的。 @aro_tech
  • 外键约束不会导致生成或插入任何值。
  • 初始声明中没有生成值吗?例如 - BookID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) CONSTRAINT BookingDetails_PK PRIMARY KEY

标签: sql auto-increment javadb


【解决方案1】:

数据库不知道您要为外键插入什么值。您必须明确插入它们。例如,对于电影时间,您需要执行以下操作:

INSERT INTO FilmTimes(FilmTime, FilmDetails_FilmID) SELECT '11:00', FilmID FROM FilmDetails

这应该在 FilmTimes 中插入两行:一行包含生成的 TimeID“11:00”和生成的 ID“Film1”,另一行包含不同的生成 TimeID“11:00”和生成的“电影 2”的 ID。例如 {1,"11:00",1} 和 {2,"11:00",2}。

您的主键是在插入时生成的,但无法生成外键 - 外键指的是已经存在于另一个表中的东西。

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2019-08-07
    • 2012-02-15
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多