Java 在mysql数据库中创建表

Java 在mysql数据库中创建表,java,mysql,Java,Mysql,我试图通过代码在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) ); CREAT

我试图通过代码在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行在“我的代码”中有“创建表用户”行

我的数据库引擎是InnoDB,通过mysql

我做错了什么?

你的问题 代码方面 只能通过引用唯一标识目标表中一行的一列或一组列来创建
外键
约束

这意味着@Ulrich是对的,您需要一个索引,但不需要任何索引,您需要一个
唯一键
约束

合乎逻辑 你需要仔细阅读一些东西。像“在此处添加索引”这样的直接解决方案可能会消除错误,但也可能会限制您对这些故事的处理(由于唯一性约束)

您的表结构可能就是问题所在,在对表结构采取新方法之前,您可能需要完全理解唯一键和外键

关于键和索引的MySQL背景信息 索引 当创建索引列时,MySQL服务器存储有关该列内容的一些数据,这使得服务器更容易找到使用该列过滤/排序的记录。因此,索引表示MySQL单独存储的数据结构,以便于阅读

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

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

此外,您可能需要声明一个多列
索引
,以涵盖博客文章的标题和内容<代码>索引对它们可以使用的数据量(字符串长度)有限制,因此有时您必须声明一个只使用列的前512个(或一些数字)字符的
索引

约束条件 当创建约束(主键
、唯一键
或外键
时,约束需要在表中查找数据以强制执行规则(唯一性或可引用性等)

因此,这些约束还需要一个
索引
。每次将列声明为
主键
唯一键
时,也会创建一个
索引
,因此您不必自己创建它


声明
外键时
需要创建的索引应位于引用表中,而不是当前表中。因此,您必须自己创建它。

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

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


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

请参见此处()-您可能需要Authorizations.authLevel上的索引。问题出在您的外键约束上。我不明白如何解决这个问题。我如何创建索引?与您的
主键
声明相同,但它将是一个
唯一键
。您可以引用另一个表上的记录,即使它不是一个表
主键
。它必须是
唯一键
,以便
外键
工作。这就是我回答的要点。