【问题标题】:How to INSERT data into a specific column without NULLs in the other columns?如何将数据插入到其他列中没有 NULL 的特定列中?
【发布时间】:2015-07-30 04:19:51
【问题描述】:

我有一个表(“table1”),有 3 个列,分别称为 col1、col2 和 col3(每个都是 VARCHAR),有 4 个值,如下所示:

col1   col2   col3
datA1  datB1  datC1
datA2  

我需要能够随时将数据添加到不影响其他列的任何列中。网上很流行的代码是这样的(比如说,我们只需要在 col2 和 col3 列中添加数据):

INSERT INTO table1 (col2, col3)
VALUES ('datB2', 'datC2');

但它会添加新行,如下所示:

col1   col2   col3
datA1  datB1  datC1
datA2
NULL   datB2  datC2

我真正需要的是用新值填充“col1”列中以值“datA2”开头的行,并获得如下表:

col1   col2   col3
datA1  datB1  datC1
datA2  datB2  datC2

该表有 3 列,每列响应特定类型的值(例如:名称、颜色、大小)。我需要的只是一种可能性,可以随时在特定列中添加新值,并且如果之前有空闲单元格,则它们没有 Null 和新行。

【问题讨论】:

  • 除非您的数据被非规范化,否则这没有任何意义。如果您只是像这样将值填充到每一列中,那么行的意义何在?
  • 它闻起来像糟糕的数据库设计..
  • 只有一个key 列和一个value 列有什么问题?
  • 你还需要看update
  • 修改现有行是 UPDATE 而不是 INSERT。垂直而不是水平。

标签: sql postgresql insert


【解决方案1】:
UPDATE table1
SET col2 = dataB2, col3 = dataC2
WHERE col1 = dataA2;

这可能会达到您的目的。

【讨论】:

  • 五月。但是使用UPDATE插入新数据有点奇怪
  • 据我理解的问题,他的意思是将row2的col2和col3从NULL设置为一些有意义的数据。如果他打算插入新数据,他不需要提及已经创建的 row2 :)
【解决方案2】:

如果要将数据添加到现有行,则必须使用 UPDATE 语句。比如这样:

UPDATE table1 SET
col2 = 'data5'
col3 = 'data6'
FROM table1
WHERE col1 = 'data4'

您的问题的根源看起来确实是糟糕的数据库设计,但此查询只是为了向您展示如何向现有行添加数据。

【讨论】:

  • 谢谢。但是,如果我不知道 col1 的当前值?每次都要分析表格,找出周围列的值,才能知道所需列的第一个空单元格在哪里?
  • 是的@ArseniiGorkin。这就是为什么我们一直说你们的桌子设计有缺陷。修复表,查询自行修复。
  • @ArsenniGorkin 如果您知道新值将进入哪一列,那么您可以更改 WHERE 子句以检查具有新值的列是否为空,以及其他列是否不会被更新不为空。但是随后此更改可能会更新您不希望它更新的行,因此@SeanLange 的评论是正确的。先修复表设计,再考虑查询。
  • 感谢您的友好回答!伙计们,设计还不错))为什么你这么认为?我需要一个包含一组静态数据(值)的表,这些数据永远不会被编辑,只会添加新的。我需要它们在值之间的相同列中没有空(或零)单元格(如'1'、'2'、''、''、'3')。我需要他们订购。您的建议被低估了,我知道我可以创建差异。每个只有 1 列的表,但我想对所有值使用一个全向表。每列是它包含的值的类型。
  • 如果您能指出您认为设计出错的原因,我将不胜感激!
【解决方案3】:

我找到了解决方案(逻辑操作链):

1) CHECK 如果有一个单元格(在目标列中),其值为""NULL

2) IF 它有一个,然后重写第一个,将这一行中其他单元格的值保留在它们的位置(假设我们使用 UPDATE))))。

3) ELSE 只需在该行的另一个单元格中添加一个所有 NULLs 的新行。

如果我们想同时将一些值添加到不同的列中,我们可以为所有这些准备查询,然后同时执行它们(抱歉重言式)。

如果我们需要在一个查询中将几个值添加到同一列中,我们可以使用循环来准备它(重复第 1 和 2 段(或者,可选地,3)。

【讨论】:

    【解决方案4】:

    给定一个表结构,有两个数据行:

    key         value
    --------------------
    team        accounts
    manager     jeff
    

    每次你想改变一个值时,你需要检查它是否已经存在(用于更新)或不存在(用于插入)。因此,要更改manager 属性的值:

    if exists(select * from keyValues where key = 'manager')
        update keyValues set value = 'mike' where key = 'manager'
    else
        insert into keyValues ('manager', 'mike')
    

    【讨论】:

      【解决方案5】:

      假设您有桌子
      CLIENT_MASTER

      客户无姓名
      C00001 伊万
      C00002 喜满酒

      现在您添加一个新列 City

      ALTER table CLIENT_MASTER  
      ADD( City varchar(10));
      

      现在,如果您想在已经存在的行中添加值,您可以使用 UPDATE 命令。
      例如

      UPDATE CLIENT_MASTER  
      SET City='Delhi'  
      WHERE ClientNo='C00001';
      

      更新后的表格是
      ClientNo Name City
      C00001 伊万·德里
      C00002 Himanshu NULL

      【讨论】:

        【解决方案6】:

        使用这个:

        INSERT INTO table1 (col2, col3)
        VALUES ('datB2', 'datC2')
        WHERE col1 = datA2;
        

        【讨论】:

        • 这是错误的。 INSERT 语法不采用 WHERE 子句,除非使用 INSERT INTO ... SELECT
        【解决方案7】:

        使用这个,如果值 null 然后插入空值。

        $cal1=$cal1 ? "data5" : '';
        $cal2=$cal2 ? "data6" : '';
        INSERT INTO table1 (col2, col3)
        VALUES ("'.$cal1.'", "'.$cal2.'");
        

        【讨论】:

        • 什么 DBMS 支持这个? OP 尚未指定他们使用的 DBMS。
        猜你喜欢
        • 2021-09-27
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多