[英]Alter all tables in database
我想在我的SQL數據庫中的所有表上運行“Alter Table”:
ALTER TABLE test ADD CONSTRAINT [COLLUM_NAME] DEFAULT ((0)) FOR [COLLUM_NAME]
我知道如何從數據庫中獲取所有現有表:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
要么
USE DATABASE_NAME
GO
SELECT name
FROM sys.Tables
GO
但我不知道如何將這兩者結合起來。
在我的數據庫(50多個表)中,所有表共有1行。 我想為所有這些行設置一個默認值。
您可以嘗試生成命令並在之后執行它。 你可以這樣做:
SELECT CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` this is my default value change on the column") as MySQLCMD
FROM TABLES
並執行檢索。
如果這是一個不需要自動化的一次性過程,那么你可能比運行類似下面的內容更糟糕,只需復制/粘貼輸出:
select 'alter table ' + t.name + ' add constraint ' + c.name + ' default ((0)) for ' + c.name
from sysobjects t join syscolumns c on c.id = t.id
where t.xtype = 'U'
如果你想使用INFORMATION_SCHEMA
SELECT 'ALTER TABLE ' +t.TABLE_NAME+ ' ADD CONSTRAINT '
+c.COLUMN_NAME +' DEFAULT ((0)) FOR '+c.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME=c.TABLE_NAME
WHERE TABLE_TYPE = 'BASE TABLE'
設置'COLUMN NAME'
並執行,它將為設置列添加默認約束。
DECLARE @sql NVARCHAR(MAX) ;
DECLARE @LINEBREAK AS VARCHAR(2)
SET @LINEBREAK = CHAR(13) + CHAR(10)
SELECT @sql = COALESCE(@sql + ';' + @LINEBREAK, '') + 'ALTER TABLE '
+ QUOTENAME([TABLES].TABLE_NAME) + ' ADD CONSTRAINT ' + QUOTENAME([COLUMNS].COLUMN_NAME)
+ ' DEFAULT ((0)) FOR ' + QUOTENAME([COLUMNS].COLUMN_NAME)
FROM INFORMATION_SCHEMA.TABLES [TABLES]
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS [COLUMNS] ON [TABLES].TABLE_NAME = [COLUMNS].TABLE_NAME
WHERE TABLE_TYPE = 'BASE TABLE'
AND [COLUMNS].[COLUMN_NAME] = 'COLUMN NAME'
PRINT @sql
EXEC sp_executesql @sql
我首選的方法是為此編寫一個SP。 我在我的數據庫中有一些這些實用程序SP,我根據需要更改它們以更新內容。 這是一個更改排序規則的示例。 您可以通過修改SET @S = ...語句看到您可以執行任何您喜歡的表更改。
DECLARE table_name VARCHAR(255);
DECLARE end_of_tables INT DEFAULT 0;
DECLARE num_tables INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT t.table_name
FROM information_schema.tables t
WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;
OPEN cur;
tables_loop: LOOP
FETCH cur INTO table_name;
IF end_of_tables = 1 THEN
LEAVE tables_loop;
END IF;
SET num_tables = num_tables + 1;
SET @s = CONCAT('ALTER TABLE ' , table_name , ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci');
PREPARE stmt FROM @s;
EXECUTE stmt;
END LOOP;
CLOSE cur;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.