我在数据库中有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语句,因此无需更新。
答案 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';
相比之下,当使用单独的表格进行联合时。