在MySQL中,在一个表中分配不同于另一个表的多重外键

在MySQL中,在一个表中分配不同于另一个表的多重外键,mysql,database,Mysql,Database,我计划为用户信息制作两个表格。第一个名为userInfo的大表包含所有数据。第二个较小的名为loginDetails的表具有最少的登录数据 我的问题是:我无法分配多个外键 MySQL说: 1005-无法创建表'test'。'logindetails'错误号:150外键约束格式不正确 以下是代码: CREATE TABLE userInfo ( userInfoUserNumber INT(255) UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, userInfo

我计划为用户信息制作两个表格。第一个名为userInfo的大表包含所有数据。第二个较小的名为loginDetails的表具有最少的登录数据

我的问题是:我无法分配多个外键

MySQL说: 1005-无法创建表'test'。'logindetails'错误号:150外键约束格式不正确

以下是代码:

CREATE TABLE userInfo
(
userInfoUserNumber INT(255) UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL,
userInfoUserName VARCHAR(255) UNIQUE NOT NULL,
userInfoPassword VARCHAR(255) NOT NULL,
userInfoFirstName VARCHAR(255) NOT NULL,
userInfoLastName VARCHAR(255) NOT NULL,
userInfoPhoneNumber INT(255) UNSIGNED ZEROFILL UNIQUE NOT NULL,
userInfoPlaceWithoutDivision VARCHAR(255) NOT NULL,
userInfoDivision VARCHAR(255) NOT NULL,
userInfoEmail VARCHAR(255) UNIQUE,
userInfoProfilePicture VARCHAR(255),

PRIMARY KEY (userInfoUserNumber)
);


CREATE TABLE loginDetails
(
loginDetailsUserNumber INT(255) UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL,
loginDetailsUserName VARCHAR(255) UNIQUE NOT NULL,
loginDetailsPassword VARCHAR(255) NOT NULL,
loginDetailsPhoneNumber INT(255) UNSIGNED ZEROFILL UNIQUE NOT NULL,
loginDetailsEmail VARCHAR(255) UNIQUE,

PRIMARY KEY (loginDetailsUserNumber) ,
FOREIGN KEY (loginDetailsUserName) REFERENCES userInfo(userInfoUserName)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
FOREIGN KEY (loginDetailsPassword) REFERENCES userInfo(userInfoPassword)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
FOREIGN KEY (loginDetailsPhoneNumber) REFERENCES userInfo(userInfoPhoneNumber)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
FOREIGN KEY (loginDetailsEmail) REFERENCES userInfo(userInfoEmail) 
    ON DELETE SET NULL
    ON UPDATE CASCADE
);
[简言之:假设我的第一个表有10列,第二个表有5列,我想从第一个表中选择任意4列并复制到第二个表]

问题2:

为什么这句话是错误的?请解释一下

INSERT INTO userInfo(userInfoUserName,userInfoPassword,userInfoFirstName,userInfoLastName,userInfoPhoneNumber,userInfoPlaceWithoutDivision,userInfoDivision)
VALUES (cat,SHA1(cat),white,cat,01111111111,myplace,mydivision);

设计外键关系时,应使用主键进行链接。这将表明:

CREATE TABLE loginDetails (
    loginDetailsUserNumber INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL,
    loginDetailsUserInfoUserNumber INT UNSIGNED,
    loginDetailsUserName VARCHAR(255) UNIQUE NOT NULL,
    loginDetailsPassword VARCHAR(255) NOT NULL,
    loginDetailsPhoneNumber INT(255) UNSIGNED ZEROFILL UNIQUE NOT NULL,
    loginDetailsEmail VARCHAR(255) UNIQUE,
    PRIMARY KEY (loginDetailsUserNumber) ,
    FOREIGN KEY (loginDetailsUserInfoUserNumber) REFERENCES userInfo(userInfoUserNumber)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
);

换句话说,您可以保留重复的列—可能用户更改了他的/她的姓名或密码,并且您需要与登录关联的版本。但是,您应该在登录时分配一个用户号,并将该id放入表中。

只有当您引用的列是键的最左边的列时,才可以声明外键

传统上,您只会引用唯一的或主键,但InnoDB奇怪地允许外键引用任何类型的键或部分键

您的列userInfo.userInfoPassword不是任何键的一部分

现在还不清楚声明所有这些外键的目的是什么。如果希望它们级联,在userInfo表中始终保持相同的值,那么为什么它们都存储在这两个表中呢?把它们放在一张桌子里

我想创建一个不同的表loginDetails,从userinfo中获取4列

为什么??如果要获取仅包含这四列的结果集,则不必创建其他表。您只需在查询中指定所需的列,而不是使用SELECT*

另一个选项是使用“创建视图”定义包含这四列的视图,然后可以从视图中使用“选择*”

CREATE VIEW loginDetails AS
  SELECT loginDetailsUserNumber,
    loginDetailsUserName,
    loginDetailsPassword,
    loginDetailsPhoneNumber,
    loginDetailsEmail
  FROM userInfo;

SELECT * FROM loginDetails;

userinfo表有许多其他列,我想创建一个不同的表loginDetails,从userinfo中选取4列
CREATE VIEW loginDetails AS
  SELECT loginDetailsUserNumber,
    loginDetailsUserName,
    loginDetailsPassword,
    loginDetailsPhoneNumber,
    loginDetailsEmail
  FROM userInfo;

SELECT * FROM loginDetails;