【问题标题】:Insert columns into new table where one of the columns doesn't allow null values在其中一列不允许空值的新表中插入列
【发布时间】:2021-10-17 03:15:48
【问题描述】:

我尝试一次将 50 行从一个表插入到另一个表中,但是我无法绕过我尝试插入的表中的“非空”列。

请注意,我无法更改该列,因此它接受空值。

我有 2 张桌子(桌子 1 和桌子 2)。我将表 1 中的 2 列插入表 2(表 2 当前为空)。问题是表 2 的第三列不能有空值。

这是我目前所拥有的。

-- Checking what exists in Table 1 that doesn't exist in Table 2 before inserting
IF EXISTS (SELECT T1.Column1, T1.Column2
           FROM Table_1 T1
           LEFT JOIN Table_2 T2 on T1.Column1=T2.Column1
           WHERE T2.Column1 IS NULL)
BEGIN
    INSERT INTO Table_2 (Column1, Column2)
        SELECT TOP(50) Column1, Column2
        FROM Table_1
        ORDER BY Column1

    SELECT @@ROWCOUNT
END

IF @@ROWCOUNT < 50
(
    SELECT * 
    FROM Table_2
)

BEGIN
    UPDATE Table_2
    SET Column3 = 0
END

问题是表 2 中的第 3 列在表 1 中不存在,因此我无法将表 1 中的任何内容插入到表 2 中以填充表 2 中不允许空值的列。

【问题讨论】:

  • 在您的 SELECT 中为表 2 中缺少的第 3 列使用常量?
  • 您必须在插入和选择中指定 Column3。除非 Column3 具有默认值,否则您无能为力。即:插入 Table_2 (Column1, Column2, Column3) SELECT top(50) Column1, Column2, 'SOMETHING' FROM Table_1
  • 为什么要检查@@ROWCOUNT的值是否小于3000,前面的查询使用TOP (50)所以它必须小于3000。
  • @Larnu 错误我已修复
  • IF EXISTS 没有多大意义:无论如何,列列表永远不会被评估,它也可能是SELECT 1,而LEFT JOIN/IS NULL 作为嵌套的NOT EXISTS 更好,并且如果EXISTS 为真,您将插入Table_1整个,因此您仍然可以获得重复的行,您还需要将Table_2 签入INSERT

标签: sql sql-server


【解决方案1】:

你可以选择一个常数

INSERT INTO Table_2 (Column1, Column2, Column3) 
SELECT top(50) Column1, Column2, 0 
FROM Table_1
ORDER BY Column1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多