如何使用现有记录的相同数据更新记录

How to update record with the same data of existing record

如何使用同一 table 中现有记录的相同数据更新记录许多列。

例如:

id  name  m_value

 1   moh   1000

 2   jo       0

我想用 id =1

的相同数据更新 id =2 的记录

之后的数据应该是这样的:

id  name  m_value

 1   moh   1000

 2   moh   1000
UPDATE target_table T
SET T.m_value = (SELECT T1.m_value FROM target_table T1 WHERE T1.id = '1')

此代码仅在 "id" 列设置为主键时有效,否则它可能 return 更多值,以查询异常结束。

请给出你的 table 的名字——当相关 table 的名字未知时,不可能写出满意的答案。在没有更好的信息的情况下,你的table是AnonymousTable

您需要一个子查询:

UPDATE AnonymousTable
   SET (name, m_value) = ((SELECT name, m_value
                             FROM AnonymousTable 
                            WHERE id = 1
                         ))
 WHERE id = 2;

这里的关键技巧是双括号。当您使用符号 SET(a, b, c) = (v1, v2, v3) 时,您需要在 = 符号的每一侧添加一组括号。当您使用子 select 生成值列表时,您将其括在括号中。因此,当您同时设置列列表并使用子查询时,您需要双括号。

您几乎肯定需要主 UPDATE 语句的条件以及子查询中的条件,如图所示。如果没有包含 id = 1 的行,那么您将分配空值,除非您对 namem_value 没有 NULL 约束——如果它们存在,它们应该存在,那么更新会失败,这很好。

请注意,没有 'all columns except …' shorthand,因此如果 table 中有 30 列,您必须列出其中的 29 列(除了 id) 在 SET 的 LHS 中,并再次在子 select.

的 select-列表中

演示

DROP TABLE IF EXISTS AnonymousTable;

CREATE TEMP TABLE AnonymousTable
(   
    id INTEGER NOT NULL,
    NAME CHAR(10) NOT NULL,
    m_value CHAR(10) NOT NULL
);  
INSERT INTO AnonymousTable VALUES(1, 'moh', '1000');
INSERT INTO AnonymousTable VALUES(2, 'jo', '0');

SELECT * FROM AnonymousTable;

UPDATE AnonymousTable
   SET (NAME, m_value) = ((SELECT NAME, m_value
                             FROM AnonymousTable 
                            WHERE id = 1 
                         ))  
 WHERE id = 2;

SELECT * FROM AnonymousTable;                                    

输出:

1|moh|1000
2|jo|0

1|moh|1000
2|moh|1000

已测试:Mac OS X 10.11.6(SQLCMD 90.01,ESQL/C 4.10.FC6)上的 Informix 12.10.FC6。

一些非常旧的 Informix 版本可能会反对针对正在更新的相同 table 的子查询。你真的不应该使用这么旧的系统,但如果它对你来说失败了,那可能就是原因。

试试这个...

$this->db->select()
->from('AnonymousTable')
->where('id', 1);
$NewData = $this->db->get()->row();
$data = ([
  'name' => $NewData->name,
  'm_value' => $NewData->m_value
]);
$this->db->where('id', 2);
$this->db->update('AnonymousTable', $data);