我正在尝试创建三个表:
用户
分类
费用
这是我的create语句的代码。一切正常,直到我将“ON DELETE ...”条款添加到费用表中。
private final static String createUsersTable =
"CREATE TABLE users ("+
"userID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), "+
"username VARCHAR(255) NOT NULL UNIQUE " +
")";
private final static String createCategoriesTable =
"CREATE TABLE categories ("+
"categoryID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), "+
"category VARCHAR(255) NOT NULL, " +
"userID INTEGER NOT NULL, " +
"FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE CASCADE"+
")";
private final static String createExpensesTable =
"CREATE TABLE expenses ("+
"expenseID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), "+
"amount INTEGER NOT NULL, "+
"date VARCHAR(255) NOT NULL, "+
"categoryID INTEGER, "+
"userID INTEGER NOT NULL, "+
"FOREIGN KEY (categoryID) REFERENCES categories (categoryID) ON DELETE SET NULL, "+
"FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE CASCADE"+
")";
这是我尝试创建表时遇到的异常:
java.sql.SQLSyntaxErrorException:外键'SQL110915104641092'无效,因为'由于删除规则限制,无法将表定义为表ME.USERS的依赖项。 (该关系使表通过多个关系删除连接到指示的表,并且现有关系的删除规则为SET NULL。)。 ”。
我必须遗漏一些关于SQL数据库的基本知识。什么?
答案 0 :(得分:1)
expenses
是指categories
,指的是users
。因此在users
中拥有expenses
的外键是多余的。我认为错误来自SET NULL
和CASCADE
之间的冲突操作。
删除user
时,会删除引用它的categories
(由于CASCADE
),categories
外键设置为NULL
在expenses
中(因为SET NULL
)。但是,与此同时,当您删除user
时,会删除引用它的expenses
(因为CASCADE
)。
单行:删除users
或expenses
中的categories
个外键,具体取决于您尝试对其进行操作...
答案 1 :(得分:0)
在表格Categories
中,除categoryID
上的候选键外,还要在categoryID
和userID
的复合词上创建一个超级键。在表Expenses
中,仅引用复合键。