MySQL:在所有表中级联列类型设置的方法?

时间:2012-02-14 00:15:20

标签: mysql sql

我正在重组我们的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的列类型

1 个答案:

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