如何继承mysql表

时间:2012-05-18 23:58:32

标签: mysql inheritance

我在数据库中有30个表,都是InnoDB。他们有自己的结构。

我想要做的是将比利时列添加到每个表中。

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci NOT NULL,
 `categoryId` int(11) NOT NULL,
 `imageId` int(11) NOT NULL,
 `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `createdId` int(11) NOT NULL,
 `updatedId` int(11) NOT NULL,
 `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL,

在编程语言(假设PHP)中,通常的方法是创建一个抽象类,将所有公共变量放在那里,然后从中继承。 MySQL怎么样?我该怎么做?

出于设计原因,我无法创建commonData表并使用外键/连接。请注意,我从头开始编写create语句,因此无需更新。

4 个答案:

答案 0 :(得分:0)

我认为最实用的方法是使用GUI mysql接口来复制表格。例如,在mac上你可以使用SequelPro并根据需要复制表,这只需要几秒钟,而不是在shell脚本中编写CREATE TABLE或其他。

答案 1 :(得分:0)

Mysql没有表继承的概念。您需要将所有这些列添加到每个表中。我会编写一个脚本来为你关心的每个表生成MODIFY TABLE ... ADD ...语句,然后针对你的数据库运行结果。

我很怀疑你找不到其他方法来组织你不需要在30个表中添加相同精确列的数据。

答案 2 :(得分:0)

我想了一段时间 - 它很复杂,会为你正在尝试做的事情添加亮点。它稍后会增加很多工作。

但是如果你真的想这样做,那么这样做的方法不是把它放在表定义中,而是创建一个可以将这些列添加到表的脚本。

类似的东西:

ALTER TABLE table_name
ADD `id` int(11) NOT NULL AUTO_INCREMENT,
ADD `name` text COLLATE utf8_unicode_ci NOT NULL,
ADD `description` text COLLATE utf8_unicode_ci NOT NULL,
ADD `categoryId` int(11) NOT NULL,
ADD `imageId` int(11) NOT NULL,
ADD `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
ADD `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
ADD `createdId` int(11) NOT NULL,
ADD `updatedId` int(11) NOT NULL,
ADD `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL;

然后只需为您拥有的每个表执行此脚本。

如果要编写脚本来执行此操作,请使用以下命令:

SHOW TABLES;

找到所有表格。然后遍历所有表并在所有表上执行alter脚本。

答案 3 :(得分:0)

我知道这是一个古老的主题,但所提供的解决方案展示了如何在创建表时创建所需的列 - 实际上是一种节省打字的设备。

我从设计的角度考虑更多。在这种情况下,可以使用公共列定义第二个表。例如:

CREATE TABLE article 
    :
    :

CREATE TABLE classified_ad
     :
     :

CREATE TABLE details
    :
 `details_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci NOT NULL,
       :
 `categoryId` int(11) NOT NULL,
 `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL,

  parent_id int(11) NOT NULL
  parent_table enum('classified_ad', 'article')

这个问题的一个问题是强制加入会带来性能损失。因此,这些架构可能会带来很多好处。

但是,如果您需要报告详细信息。例如,允许员工报告,然后这将看到好处,例如

SELECT * from details WHERE allowedEmployeeIds = '1';

相比之下,当使用单独的表格进行联合时。