更改现有列,使其从 MYSQL 数据库中的另一个表中提取数据

Posted

技术标签:

【中文标题】更改现有列,使其从 MYSQL 数据库中的另一个表中提取数据【英文标题】:Alter An Existing Column So It Pulls In Data From Another Table In A MYSQL Database 【发布时间】:2021-10-06 22:25:03 【问题描述】:

我有一个 mysql 数据库(在 phpMyAdmin 中),其中包含两个表 usersposts。两者都有一个username 列。我想修改posts 表中的username 列并使其从users 表中提取用户名数据,即posts 表中的数据自动从users 表中更新,并且在 users 表的任何更新中引用它。

我最初认为这是使用外键完成的,但如果我理解正确外键只与父表中的主键相关?

我收到一条错误消息,指出以下语法不正确,尽管它没有给我任何提示/解决方案:

ALTER TABLE posts
MODIFY COLUMN username VARCHAR(55) NOT NULL
REFERENCES users(username) ON UPDATE CASCADE

如何修改现有列,使其引用/使用数据库中不同表中的列数据?

两个表中的username列具有相同的类型、大小和属性,即VARCHAR(55) NOT NULL,并且使用的是innoDB存储引擎。

【问题讨论】:

查看JOINS的使用方法。 @danblack 不是在查询数据库时使用joins 吗?我希望从usersusername 列填充postsusername 列,就像使用不同表的主键填充外键列一样。 in the same way a foreign key column is populated using the primary key of a different table - 这不是一回事。在结构化查询语言中,提供结构的是查询 【参考方案1】:

外键是一种数据完整性检查,仅此而已。它确保子表中的字段包含出现在父表中引用字段中的值。这就是所有*

您不能使用外键来将数据从一个表合并到另一个表中。但是,JOIN 语句完全符合您的需要,并且与外键结合使用可确保每个帖子都有一个有效的用户名来识别正确的用户数据。

举个例子:

用户数据

CREATE TABLE `userdata` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `displayName` varchar(45) NOT NULL,
  `email` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

帖子

CREATE TABLE `posts` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `message` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  KEY `fk_posts_userdata_idx` (`username`),
  CONSTRAINT `fk_posts_userdata` FOREIGN KEY (`username`) REFERENCES `userdata` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

我们可以使用此查询将JOIN userdata 表映射到posts 表:

select 
    `posts`.`id` AS `postId`,
    `posts`.`username` AS `username`,
    `posts`.`message` AS `message`,
    `userdata`.`id` AS `userId`,
    `userdata`.`displayName` AS `displayName`,
    `userdata`.`email` AS `email` 
from (`posts` 
         join `userdata` 
         on(`userdata`.`username` = `posts`.`username`));

您可以更进一步,创建一个VIEW,根据此查询返回数据:

CREATE VIEW `posts_users` AS 
  select 
    `posts`.`id` AS `postId`,
    `posts`.`username` AS `username`,
    `posts`.`message` AS `message`,
    `userdata`.`id` AS `userId`,
    `userdata`.`displayName` AS `displayName`,
    `userdata`.`email` AS `email` 
  from (`posts` 
         join `userdata` 
         on(`userdata`.`username` = `posts`.`username`));

使用带有SELECT 语句的视图:

    select * from posts_users order by postId

演示:https://www.db-fiddle.com/f/tbBXvthBtwH7CKu1yjzPjQ/0

*外键还允许对父表的更新和删除以级联到子表,但这超出了这里的范围。

【讨论】:

UNIQUE KEY id_UNIQUE (id) 肯定是多余的 @radocaw 可能,但我只是粘贴了 MySQL Workbench 生成的 CREATE 语句。它有效,我没有时间去猜测它

以上是关于更改现有列,使其从 MYSQL 数据库中的另一个表中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mysql 中的另一个表向表中添加列?

MySQL修改表结构

如何根据同一数据库中的另一个值更改mysql中的值?

如何将数据从一个表复制到 MySQL 中的另一个新表?

是否可以更改 sqlite db 表中的现有列

9)-MySQL修改表结构