您可以在 MySQL 数据库中使用数据类型:varchar() 吗?

Can you use data type: varchar() in MySQLl Databases?

我尝试添加一个 VARCHAR 类型的外键,该外键也引用另一个 table 类型为 VARCHAR 的列。两列的类型和长度相同,但我不断收到错误消息:无法添加外键约束。缺少约束索引

下面的第一个table在创建时没有问题但是第二个table是抛出错误的table:Failed to add the foreign关键约束。引用的 table 'users'

中缺少约束 'FK_Session_User' 的索引

我要引用的列 I 是用户名列。

CREATE TABLE Users (
    UserID INT NOT NULL AUTO_INCREMENT,
    Role_Code VARCHAR(15) NOT NULL,
    UserName VARCHAR(40) NOT NULL,
    Password TEXT NOT NULL,
    CONSTRAINT PK_User PRIMARY KEY (UserID, UserName),
    CONSTRAINT FK_User_Roles FOREIGN KEY (Role_Code)
    REFERENCES Roles(Role_Code));


CREATE TABLE Auth_Users (
    SessionID VARCHAR(96) NOT NULL,
    UserName VARCHAR(40) NOT NULL,
    Last_Visit TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT PK_AuthUser PRIMARY KEY (SessionID),
    CONSTRAINT FK_Session_User FOREIGN KEY (UserName)
    REFERENCES Users(UserName) 
    );

问题是用户名没有在用户上建立索引。你应该给它添加一个索引。你可以这样做:

CREATE TABLE Users (
    UserID INT NOT NULL AUTO_INCREMENT,
    Role_Code VARCHAR(15) NOT NULL,
    UserName VARCHAR(40) NOT NULL,
    Password TEXT NOT NULL,
    INDEX(UserName),
    CONSTRAINT PK_User PRIMARY KEY (UserID, UserName),
    CONSTRAINT FK_User_Roles FOREIGN KEY (Role_Code)
    REFERENCES Roles(Role_Code)
);

更新:话虽如此,请看这个:。 为什么你不应该那样做。

我建议以一种只有唯一性而非空值作为参考的方式对数据进行规范化。

在您的情况下,解决该问题的最简单方法是在您的外键中引用 UserID。另外,这很可能是您真正想要做的。