我们已将数据库从int升级到bigint。不过,我们希望选择迁移回最后一个选项。那时我们需要将数据库改回来。SQL:遍历数据库中的所有列并更改类型
因此,基本上遍历所有表和列,如果类型== bigint更改为int。到目前为止,我还没有找到一个好办法来做到这一点。
我们支持bot postgres sql和sql server。不确定这可以以统一的方式完成,或者如果需要两个版本。
我们已将数据库从int升级到bigint。不过,我们希望选择迁移回最后一个选项。那时我们需要将数据库改回来。SQL:遍历数据库中的所有列并更改类型
因此,基本上遍历所有表和列,如果类型== bigint更改为int。到目前为止,我还没有找到一个好办法来做到这一点。
我们支持bot postgres sql和sql server。不确定这可以以统一的方式完成,或者如果需要两个版本。
您可以简单地生成ALTER语句
SELECT 'ALTER TABLE ' + TABLE_NAME + ' ALTER COLUMN ' + COLUMN_NAME + ' INT ' + CASE when IS_NULLABLE = 'NO' THEN 'NOT' END + ' NULL' + char(13) + 'GO'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'bigint'
你可以在PostgreSQL创建一个函数来做到这一点:
CREATE OR REPLACE FUNCTION bigint_to_int() RETURNS VOID AS $$
DECLARE
m_Record RECORD;
BEGIN
FOR m_Record IN
SELECT information_schema.columns.table_name, information_schema.columns.column_name
FROM information_schema.columns
WHERE information_schema.columns.data_type = 'bigint'
AND information_schema.columns.table_schema = 'public'
LOOP
EXECUTE 'ALTER TABLE ' || QUOTE_IDENT(m_Record.table_name) || ' ALTER COLUMN ' || QUOTE_IDENT(m_Record.column_name) || ' TYPE INTEGER;';
END LOOP;
END;
$$ LANGUAGE plpgsql VOLATILE;
然后,你可以调用它使用:
SELECT bigint_to_int();
你将不得不在SQL Server中做同样的事情,尽管...
...和information_schema是标准的,尽管有时候类型名称之类的东西会有所不同,所以对于类型名称差异可能需要某些OR或CASE语句。 –