Java DB - 为什么我不能用这些外键约束创建这个表?

时间:2011-09-15 18:08:16

标签: sql javadb

我正在尝试创建三个表:

用户

  • 用户名
  • 用户ID

分类

  • 类别
  • 的categoryID
  • userID (引用用户表)

费用

  • 金额
  • 日期
  • expenseID
  • categoryID (参考类别表) 不工作!
  • userID (引用用户表) 不工作!

这是我的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数据库的基本知识。什么?

2 个答案:

答案 0 :(得分:1)

expenses是指categories,指的是users。因此在users中拥有expenses的外键是多余的。我认为错误来自SET NULLCASCADE之间的冲突操作。

删除user时,会删除引用它的categories(由于CASCADE),categories外键设置为NULLexpenses中(因为SET NULL)。但是,与此同时,当您删除user时,会删除引用它的expenses(因为CASCADE)。

单行:删除usersexpenses中的categories个外键,具体取决于您尝试对其进行操作...

答案 1 :(得分:0)

在表格Categories中,除categoryID上的候选键外,还要在categoryIDuserID的复合词上创建一个超级键。在表Expenses中,仅引用复合键。