我试图通过代码
在mysql数据库中创建两个表这是我的创作脚本
CREATE DATABASE if not exists feedback;
CREATE TABLE IF NOT EXISTS Authorizations(
authDesc CHAR(50),
id MEDIUMINT NOT NULL AUTO_INCREMENT,
authLevel INT NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS Users(
lastName CHAR(50) NOT NULL,
userID MEDIUMINT NOT NULL,
phone CHAR(15),
email CHAR(50),
address CHAR(100),
authLevel INT NOT NULL DEFAULT 0,
FOREIGN KEY(authLevel) REFERENCES Authorizations (authLevel),
login CHAR(30) NOT NULL,
firstName CHAR(50) NOT NULL,
PRIMARY KEY (login),password CHAR(30) NOT NULL
);
我在尝试执行
时遇到此错误java.sql.SQLException: Can't create table 'feedback.users' (errno: 150)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1811)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1725)
at com.database.Database.createDatabase(Database.java:45)
at com.database.Main.main(Main.java:6)
第45行在我的代码中有create table users行
我的数据库引擎是InnoDB,通过mysql
我做错了什么?
答案 0 :(得分:1)
您只能通过引用唯一标识目标表中单个行的列或列集来创建FOREIGN KEY
约束。
这意味着@Ulrich是对的,你需要一个索引,但不需要UNIQUE KEY
约束的任何索引。
你需要阅读一些内容。像“在这里添加一个索引”这样的直接解决方案可能会使错误变得沉寂,但它也可能限制你可以对这些故事做些什么(由于唯一性约束)。
您的表结构可能是问题所在,您可能需要完全了解UNIQUE KEY和FOREIGN KEY,然后才能对表结构采用新的方法。
创建索引列时,MySQL服务器会存储有关该列内容的一些数据,这使服务器更容易查找使用该列过滤/排序的记录。因此,索引表示由MySQL单独存储的数据结构,以便于阅读。
如果您知道您的应用程序将尝试按某列搜索记录(例如:title,name,created_at等),您可能需要声明一个简单的INDEX
或KEY
来指定您希望轻松查找这些列。直接选择会更快,连接会更快等等。
该表还将使用更多内存,因为某些额外数据存储在有关这些列的某处。
此外,您可能需要声明多列INDEX
才能覆盖ex。博客文章的标题和内容。 INDEXES
限制了他们可以使用的数据量(字符串长度),因此您有时必须声明INDEX
仅使用列的前512个(或某些数字)字符(或多个)。
创建约束(PRIMARY KEY
,UNIQUE KEY
或FOREIGN KEY
)时,约束需要在表中查找数据以强制执行规则(唯一性或可引用性等) )。
因此,这些约束也需要INDEX
。每当您将列声明为PRIMARY KEY
或UNIQUE KEY
时,也会创建INDEX
,因此您无需自行创建。
声明FOREIGN KEY
时,需要创建的索引应该在引用的表中,而不是在当前表中。因此,你必须自己创建它。
答案 1 :(得分:0)
您不能使用外键引用非主键的其他表的字段。
使用Authorization.id作为链接到外键的字段。
然后,如果您真的需要了解users表中的authLevel,请加入这两个表。