如何使用现有记录的相同数据更新记录
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
的行,那么您将分配空值,除非您对 name
或 m_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);
如何使用同一 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
的行,那么您将分配空值,除非您对 name
或 m_value
没有 NULL 约束——如果它们存在,它们应该存在,那么更新会失败,这很好。
请注意,没有 'all columns except …' shorthand,因此如果 table 中有 30 列,您必须列出其中的 29 列(除了 id
) 在 SET 的 LHS 中,并再次在子 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);