【问题标题】:Inserting values into MySQL based on different table's value根据不同表的值将值插入 MySQL
【发布时间】:2014-06-06 16:17:06
【问题描述】:

您好,我有一个简单的问题。假设我有一个用户表,其中包含 userId 和 username 等列,然后我有一个表“通知”,我还有 userId 和 username 等列。

所以我的问题是 - 我是否能够以某种方式将 userId 值插入到通知中,并且用户名值将根据 users 表中的 userId 自动插入。这是因为我不想在插入通知之前以某种方式访问​​用户表,我认为这是无用的浪费。使用 MySQL 可以实现类似的功能吗?

【问题讨论】:

  • 更好的解决方案是从notifications 表中删除username 列。
  • 我的意思是有时我需要从某个地方读取用户名,我认为如果全部都在通知表中可能会更好 - 1 选择 +1 列或 2 选择 -1 列跨度>

标签: mysql sql key


【解决方案1】:

此触发器自动在通知表中插入数据。每当在用户表中插入新行时就会触发。

delimiter #

create trigger insert_name after insert on user
for each row
begin
  insert into notifications (id, user_name) values (select id,user_name from user);
end#

注意:

如果您想在数据库中自动执行删除或插入任务,触发器是处理这种情况的最佳方式。人们不使用它的原因是因为它对于大量表来说有点难以实现,而且它也是一个有点慢,每次更改表架构时都需要更新它。

【讨论】:

  • @tadman 是的,我知道,但用户想知道这是否可能。
  • 是的,但是像插入通知(id,名称)之类的东西选择 1,username from user where userid=1;会是更好的尝试
  • 好吧,这很混乱,所以没有一些关系——外键或任何会自动填充它的东西?
【解决方案2】:

如果您可以编写具有正确结果的 SELECT 查询,则可以将其链接到 INSERT

INSERT INTO notifications (user_id, user_name)
  SELECT id, name FROM users

基本上INSERT INTO 语句允许插入来自任意SELECT 的数据。只要列匹配,它应该可以正常工作。

如果您要更新具有用户 ID 但没有名称的表:

UPDATE notifications, users
  SET notifications.user_name=users.name
  WHERE notifications.user_id=users.id

如果您希望自动执行此操作,您需要创建一个TRIGGER

通常,这种denormalization 是在您拥有撰写通知所需的所有数据并且仍然加载了有关用户的数据时完成的。

【讨论】:

  • 好的,谢谢,当我尝试谷歌搜索时,我阅读了有关触发器的信息,因此这可能是一个解决方案。
  • @tadman 用户只想在通知表中输入 id 时输入数据。
  • 当您用尽所有其他选项时,触发器通常是最后的手段。它们可能导致您的应用程序中出现非常神秘的行为,并且通常难以维护。如果您有任何其他方法可以实现这一点,我会先尝试。另请记住,一旦您进行非规范化,您就会立即遇到同步问题,如果用户可以更改他们的名称,则需要编写一个工具来更新这些重复数据。
  • 好吧,你认为多选 1 次就比触发一次好吗?
  • 这取决于您在插入通知记录时手头有哪些数据。如果用户正在创建它并且您已经加载了用户记录,这在任何应用程序框架中都很常见,那么只需在此时推送用户的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多