0

我正在尝试通过代码在 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

我究竟做错了什么 ?

4

2 回答 2

1

你的问题

代码明智

您只能FOREIGN KEY通过引用唯一标识目标表中的一行的一列或一组列来创建约束。

这意味着@Ulrich 是正确的,您需要一个索引,但不是任何您需要UNIQUE KEY约束的索引。

逻辑的

您需要阅读一些内容。像“在此处添加索引”这样的直接解决方案可能会消除错误,但它也可能会限制您可以对这些故事执行的操作(由于唯一性约束)。

您的表结构可能是问题所在,您可能需要充分了解 UNIQUE KEY 和 FOREIGN KEY,然后才能对表结构采取新方法。

MySQL 关于键和索引的背景信息

索引

在创建索引列时,MySQL 服务器存储有关该列内容的一些数据,这使得服务器更容易找到使用该列过滤/排序的记录。所以索引代表了一个由 MySQL 单独存储的数据结构,以便于阅读。

如果您知道您的应用程序将尝试按特定列搜索记录(例如:标题、名称、created_at 等),您可能希望声明一个简单的INDEXKEY指定您希望轻松查找这些列。直接选择会更快,连接会更快等等。

该表还将使用更多内存,因为一些额外的数据存储在与这些列有关的某处。

此外,您可能需要声明一个多列INDEX以覆盖 ex。博客文章的标题和内容。INDEXES他们可以使用的数据量(字符串长度)有限制,因此您有时必须声明INDEX仅使用列的前 512 个(或某个数字)字符的一个。

约束

创建约束(a PRIMARY KEY、 aUNIQUE KEY或 a FOREIGN KEY)时,约束需要在表中查找数据以强制执行规则(唯一性或可引用性等)。

因此,这些约束也需要一个INDEX. 每次你声明一个列 asPRIMARY KEY或 as UNIQUE KEYan时INDEX也会创建,所以你不必自己创建它。

在声明FOREIGN KEY需要创建的索引时,应该在被引用的表中而不是在当前表中。因此,您必须自己创建它。

于 2013-08-02T14:42:34.967 回答
0

您不能使用外键引用非主键的其他表的字段。

改为使用 Authorization.id 作为链接到您的外键的字段。

然后,如果您确实需要了解 users 表中的 authLevel,请加入这两个表。

于 2013-08-02T15:17:45.237 回答