我正在重组我们的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的列类型
答案 0 :(得分: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语句。而不是SQL,请使用m4 macro processor。
# 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)仍然只是一行更改。