mysql - 在一个表中分配不同的多个外键与 MySQL 中的另一个表

标签 mysql database

enter image description here我打算为用户信息制作 2 个表。第一个名为 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 列并复制到我的第二个表]

问题二:

为什么这个语句是错误的?请解释

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

最佳答案

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

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

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

尚不清楚声明所有这些外键的目的是什么。如果您希望它们级联,在 userInfo 表中始终保持相同的值,那么为什么它们要存储在两个表中呢?只需将它们存储在一张表中即可。


i want to create a different table (loginDetails) taking 4 columns from userinfo

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

SELECT loginDetailsUserNumber,
  loginDetailsUserName,
  loginDetailsPassword,
  loginDetailsPhoneNumber,
  loginDetailsEmail
FROM userInfo;

另一种选择是使用 CREATE VIEW 来定义包含这四列的 View ,然后您可以在 View 中使用 SELECT *

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

SELECT * FROM loginDetails;

关于mysql - 在一个表中分配不同的多个外键与 MySQL 中的另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40410665/

相关文章:

php - PDO UPDATE 未更新 - 无错误

php - 在 php 中按升序排列的最后 20 个数据

c# - asp.net web 应用程序如何在线使用 Microsoft Access 数据库文件?

.net - 获取 ADO.NET 中的参数前缀

php - 使用 CONCAT 格式化 MySQL

Mysql 计算从给定 id 到返回计数值之和的范围内不同价格值的行

MySQL 说 : Host '10.10.10.121' is not allowed to connect to this MySQL server

mysql - 连接表格和 map 显示

mysql - 我想一直将 mysql 数据库从远程 PC 同步到本地 PC。

php - 如何将 MySQL 查询转换为 Laravel Eloquent 查询?