如何从其他表查询结果为非空新增列设置默认值?
解决方法
你遇到的问题是因为数据库不支持在ALTER TABLE ADD COLUMN语句里直接用关联子查询定义列值。可以按以下步骤操作:
第一步:先添加允许为空的目标列
先创建列,暂时允许为空,方便后续填充数据:ALTER TABLE MY_TABLE ADD NEW_COLUMN 数据类型; -- 替换成实际类型,比如INT、VARCHAR(100)第二步:关联另一张表填充数据
通过UPDATE语句关联ANOTHER_TABLE,把匹配的ANOTHER_COLUMN值写入NEW_COLUMN:
-- SQL Server/PostgreSQL写法UPDATE MY_TABLE SET NEW_COLUMN = ANOTHER_TABLE.ANOTHER_COLUMN FROM MY_TABLE JOIN ANOTHER_TABLE ON MY_TABLE.FIELD1 = ANOTHER_TABLE.FIELD1;-- MySQL写法
UPDATE MY_TABLE JOIN ANOTHER_TABLE ON MY_TABLE.FIELD1 = ANOTHER_TABLE.FIELD1 SET MY_TABLE.NEW_COLUMN = ANOTHER_TABLE.ANOTHER_COLUMN;第三步:设置列为不可为空
数据填充完成后,修改列属性为非空:ALTER TABLE MY_TABLE ALTER COLUMN NEW_COLUMN 数据类型 NOT NULL;可选:新增行自动填充值(用触发器)
如果希望后续插入新行时,NEW_COLUMN能自动从ANOTHER_TABLE获取对应值,可创建触发器:
-- SQL Server触发器示例CREATE TRIGGER TRG_MY_TABLE_AUTO_FILL ON MY_TABLE AFTER INSERT AS BEGIN UPDATE MY_TABLE SET NEW_COLUMN = ANOTHER_TABLE.ANOTHER_COLUMN FROM MY_TABLE JOIN ANOTHER_TABLE ON MY_TABLE.FIELD1 = ANOTHER_TABLE.FIELD1 WHERE MY_TABLE.主键列 IN (SELECT 主键列 FROM inserted); END;-- MySQL触发器示例
DELIMITER // CREATE TRIGGER TRG_MY_TABLE_AUTO_FILL AFTER INSERT ON MY_TABLE FOR EACH ROW BEGIN UPDATE MY_TABLE t JOIN ANOTHER_TABLE a ON t.FIELD1 = a.FIELD1 SET t.NEW_COLUMN = a.ANOTHER_COLUMN WHERE t.主键列 = NEW.主键列; END // DELIMITER ;
内容的提问来源于stack exchange,提问作者TryMe
相关产品推荐
相关产品推荐

