gpt4 book ai didi

MySQL:如何在所有表中级联列类型设置?

转载 作者:行者123 更新时间:2023-11-29 14:34:51 25 4
gpt4 key购买 nike

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

示例:

在我的 useraccount 表中,用户列是 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 的列类型

最佳答案

在 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 将用“varchar(15) not null”替换 USER_DOMAIN。

$ 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) 仍然只是一行更改。

关于MySQL:如何在所有表中级联列类型设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com