在PostgreSQL中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到其他类型的新列,从而在上重写一个表COMMIT
,
CREATE TABLE foo ( a int );
INSERT INTO foo VALUES (1),(2),(3);
其次是,
BEGIN;
ALTER TABLE foo ADD COLUMN b varchar;
UPDATE foo SET b = CAST(a AS varchar);
ALTER TABLE foo DROP COLUMN a;
COMMIT;
但是,Microsoft SQL Server中的同一件事似乎会产生错误。比较此工作的db fiddle,其中ADD
(column)命令在事务之外,
-- txn1
BEGIN TRANSACTION;
ALTER TABLE foo ADD b varchar;
COMMIT;
-- txn2
BEGIN TRANSACTION;
UPDATE foo SET b = CAST( a AS varchar );
ALTER TABLE foo DROP COLUMN a;
COMMIT;
到这个无效的数据库小提琴,
-- txn1
BEGIN TRANSACTION;
ALTER TABLE foo ADD b varchar;
UPDATE foo SET b = CAST( a AS varchar );
ALTER TABLE foo DROP COLUMN a;
COMMIT;
但是错误
Msg 207 Level 16 State 1 Line 2
Invalid column name 'b'.
无论如何,对于DDL,该事务的行为类似于PostgreSQL吗?