【问题标题】:Create a table who's name must be a primary key in another table创建一个表,其名称必须是另一个表中的主键
【发布时间】:2015-09-06 09:36:55
【问题描述】:

有没有一种方法可以强制我的 MySQL 数据库允许创建一个名为 table_xyz 的新表,前提是另一个表中存在 table_xyz 的记录?

基本上我希望我的表名是外键。

例如allowed_tables 结构:

table_id | other columns |
--------------------------
table_xyz| bla bla bla   |
--------------------------

因为我在 allowed_tables 中有一条带有 table_xyz 的记录,所以我可以用这个名称创建一个表。如果我删除记录,表应该会自动删除。如果我更改表名,也会发生同样的情况。

编辑 1:

表 allowed_structures 实际上称为贷款。它包含loan_id 和合同所需的其他列。插入这条记录后,我创建了一个名为 的表(一条记录必须存在于借贷表中)。如果我在贷款表中更新/删除带有 的记录,我希望自动更改该表名,而不是通过 PHP 脚本。目前是通过 PHP 脚本完成的。

我需要知道执行此操作的最佳选择以及原因。谢谢!

【问题讨论】:

  • 我认为您需要重新阅读数据库设计。
  • 这听起来像是糟糕的设计,但您可以尝试使用源表的触发器创建/更新/删除新表。
  • 我建议使用与名称不同的标识符,为贷款表创建一个不像名称那样可修改的唯一标识符。

标签: mysql


【解决方案1】:

这最初是为 SQL Server 编写的,但每个 RDBMS 的概念都是相同的。

是的,这是可以实现的,但是Curse and Blessing Dynamic SQL by Erland Sommarskog

创建表@tbl

这里的愿望是创建一个名称在运行时确定的表。

如果我们只看反对在存储过程中使用动态 SQL 的论点,其中很少有真正适用于此的。如果存储过程中包含静态 CREATE TABLE,则运行该过程的用户必须具有创建表的权限,因此动态 SQL 不会更改任何内容。计划缓存显然与它无关。等等。

然而:为什么?你为什么想做这个? 如果您在应用程序中动态创建表,那么您就错过了一些有关数据库设计的基础知识。在关系数据库中,表和列的集合应该是不变的。它们可能会随着新版本的安装而改变,但不会在运行时发生变化。

编辑:

在 SQL Server 中,我会为源表 (FOR INSERT/UPDATE/DELETE) 使用触发器并使用 Dynamic-SQL 我可以完全实现您想要的,但我仍然认为这是疯狂

如果你想走这条路,请检查 MySQL 是否支持。

【讨论】:

  • 感谢您的回答。我更新了我的以显示创建名称必须存在于另一个表中的新表的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多