1

我在一个数据库中有 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表并使用外键/连接。请注意,我是从头开始编写创建语句,因此无需更新。

4

4 回答 4

0

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

于 2012-05-19T00:04:37.287 回答
0

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

我怀疑您是否找不到其他方式来组织您的数据,而无需将相同的确切列添加到 30 个表中。

于 2012-05-19T00:06:29.980 回答
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 脚本。

于 2012-05-19T00:11:04.827 回答
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';

相比之下,在使用单独的表时使用联合。

于 2013-10-18T14:13:33.490 回答