SQL外键不自动递增

时间:2016-01-17 06:41:15

标签: sql auto-increment javadb

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

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

1 个答案:

答案 0 :(得分:0)

数据库不知道要为外键插入的值。您必须明确插入它们。例如,对于电影时代,你需要做这样的事情:

public class Point<T> where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> { protected readonly Type[] AllowedTypes = { typeof(decimal), typeof(double), typeof(short), typeof(int), typeof(long), typeof(sbyte), typeof(float), typeof(ushort), typeof(uint), typeof(ulong) }; public Point() { if (!this.AllowedTypes.Contains(typeof(T))) { throw new NotSupportedException(typeof(T).ToString()); } } public T X { get; set; } public T Y { get; set; } // UPDATE: arithmetic operations require dynamic proxy-Properties or // variables since T is not explicitly numeric... :( public T CalculateXMinusY() { dynamic x = this.X; dynamic y = this.Y; return x - y; } }

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

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