【问题标题】:MySQL: Way to cascade column type settings across all tables?MySQL:跨所有表级联列类型设置的方法?
【发布时间】:2012-03-05 09:58:35
【问题描述】:

我正在重新组织我们的 MySQL 数据库,将 MyISAM 表更改为 InnoDB 并设置外键,我想知道是否还有一种方法可以链接列设置?

例子:

在我的用户帐户表中,用户列是 varchar(20)。在我的所有其他表中,另一个用户列记录谁输入了该记录,也是 varchar(20)。

我想知道如何链接所有这些相关的用户列,例如如果我必须将 useraccount.user 列更改为 varchar(40),我可以将所有其他表用户列设置为级联到 varchar(40 ) 也一样?

我确信我可以使用信息模式来编写一个 PHP 脚本来执行此操作,但如果可能的话,我宁愿让数据库在没有外部帮助的情况下自行修改。这可以通过对 username.user 列的架构记录的触发器来完成吗?如果是这样,我是否还可以触发以在添加了“用户”列的任何新表上自动添加外键约束?

似乎应该是可能的,但我承认我对 MySQL 的了解不够深入,无法搞砸模式表;)

编辑:这是我为查找不匹配的表而编写的一些示例 SQL

SELECT TABLE_NAME, COLUMN_TYPE
FROM information_schema.COLUMNS 
WHERE TABLE_NAME != 'user_accounts'
AND COLUMN_NAME = 'user'
AND COLUMN_TYPE != (
    SELECT COLUMN_TYPE 
    FROM information_schema.COLUMNS 
    WHERE TABLE_NAME = 'user_accounts' 
    AND COLUMN_NAME = 'user'
)

理想情况下,我想使用此 information_schema 结果循环遍历上述结果的每一行并更改表以更改列类型以匹配 user_account.user 的列类型

【问题讨论】:

  • 如果我没有误会的话……你考虑过使用关系结构吗?因此,除了为保存所有用户而创建的表之外,每个表中的“用户”都将成为users 表中唯一用户的快捷方式。
  • 不同表的用户列总是同名吗?
  • inhan,我已经有了用外键链接的表。我不关心用户值本身,而是他们所在的表的用户列设置。cctan,他们之前有“用户名”和“Last_Changed_User”,但我正在将它们全部重命名为“用户” " 所以是的,他们今后都会被命名为相同的

标签: mysql sql


【解决方案1】:

在 SQL 中,DDL 不会级联。

在标准 SQL 中,您将使用域(遗憾的是 MySQL 不支持)。假设您在版本控制系统中存储了this PostgreSQL code

create domain USER_DOMAIN varchar(15) not null;

create table users (
  user USER_DOMAIN primary key
);

create table another_table (
  user USER_DOMAIN references users (user),
  other_column char(1) not null,
  primary key (user, other_column)
);

当需要时,你可以在版本控制中更改一行代码。 . .

create domain USER_DOMAIN varchar(20) not null;

。 . .转储数据,加载新架构,重新加载数据,就完成了。但请注意,在庞大的数据库上这可能需要相当长的时间。 (移动数据花费的时间最多。)

你可以在 MySQL 中完成同样的事情,即使它不支持 CREATE DOMAIN 语句。使用 m4 macro processor 代替 SQL。

# test.m4 -- demonstrate replacing CREATE DOMAIN with m4 macro.
define(`USER_DOMAIN', `varchar(15) not null')dnl

create table users (
  user USER_DOMAIN primary key
);

create table another_table (
  user USER_DOMAIN references users (user),
  other_column char(1) not null,
  primary key (user, other_column)
);

然后通过 m4 将该代码作为 makefile 的一部分运行。 m4 将 USER_DOMAIN 替换为 'varchar(15) not null'。

$ m4 test.m4

create table users (
  user varchar(15) not null primary key
);

create table another_table (
  user varchar(15) not null references users (user),
  other_column char(1) not null,
  primary key (user, other_column)
);

现在改成 varchar(20) 还是只改了一行。

【讨论】:

  • 感谢您的建议,我将不得不阅读 DDL。 Postgre可能是要走的路。现在的问题是,当我已经可以使用 PHP chron 作业脚本完成我想要的事情时,迁移数据和重写 php mysql 连接脚本所花费的时间值得像这样的小便利吗?大声笑
猜你喜欢
  • 2023-04-02
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2011-08-16
  • 2020-03-19
  • 2020-06-06
  • 2010-11-14
相关资源
最近更新 更多