【问题标题】:Is it possible to insert a 'row' into a view composed of multiple tables with a common auto-increment primary key?是否可以将“行”插入由具有公共自增主键的多个表组成的视图中?
【发布时间】:2011-11-08 12:35:24
【问题描述】:

我一直在阅读有关 MySQL 中视图的更多信息(不是我的强项),但我现在想知道是否有人有一个示例,说明如何将一行插入由多个表组成的视图中,其中是超类型和子类型的关系吗?

例如,“党模型”层次结构,显示雇主和员工的角色:

      party
    _ _ | _ _
   |         |
employer   staff

以下表格(简化):

party                             employer               staff
--------------------------------  ---------------------  -----------------
party_ID INT auto_increment (PK)  party_ID INT (FK)      party_ID INT (FK)
party_name VARCHAR                tax_reference VARHCAR  job_title VARCHAR
etc...                            etc...                 etc...

我知道我可以创建一个视图来处理相关的关系:

CREATE VIEW staff_view AS SELECT party.party_ID, etc... FROM party INNER JOIN staff

当我添加员工时,我想在聚会表中创建一条记录,然后在员工表中引用自动增量party_ID。我看不到如何在一个语句中执行插入,例如:

INSERT INTO staff_view (party_name, job_title, etc...) VALUES ('John Doe', 'CEO', etc)

我知道我可以通过编程方式实现这一点,但我希望有一种方法可以直接在数据库中完成并保持参照完整性。您将如何处理这个问题?

(MySQL 文档:http://dev.mysql.com/doc/refman/5.1/en/view-updatability.html

【问题讨论】:

  • 您不能插入到多表视图中,除非您只指定来自 1 个源表的字段。我能想到的用单个查询进行插入的唯一方法是编写一个存储过程。
  • @Sam,您有一个示例说明如何使用存储过程来执行此操作吗?

标签: mysql sql database database-design data-structures


【解决方案1】:

也许您可以通过插入trigger 来解决您的问题?

【讨论】:

  • 嗨 flob - 您对如何实现这一点有任何指示吗?如果staff的触发器是在party的insert语句之前定义的,那么staff的值如何与party的值同时发送?
  • 在触发器中,您可以插入到派对表中,然后使用 LAST_INSERT_ID() 获取下一次插入的外键值。如果您在一个事务中执行此操作,则其他会话将“同时”。 dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
  • 您好,我已将此问题标记为答案,因为在技术上不可能按照我直接询问的方式进行操作,因此触发方法是最合适的。
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2010-11-25
  • 2011-04-23
  • 2018-03-21
  • 2014-06-05
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多