В SQL DDL не работает каскадно.
В стандартном SQL вы бы использовали домены (которые, к сожалению, MySQL не поддерживает).Допустим, у вас этот код PostgreSQL хранится в вашей системе контроля версий.
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 .
# 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 как часть вашего make-файла.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) по-прежнему выполняется только в одну строку.