mysql - MYSQL 在插入查询中使用多项选择返回列数与第 1 行的值计数不匹配
问题描述
更新
有时,当一个家庭从系统中被灭活时,它可能包含超过 1 个个体。在我的例子中,在 sql fiddle 上显示,family_id=12 的家庭有 3 个人。
我需要将这三个人的数据从一个indiviudal
表插入到另一个individual_history
表中,并将字段更改ind_action
为以下消息HH has been inactivated
。
这是一个示例数据:
| individual_id | household_id | family_relation_id | marital_status_id | ind_lmms_id | ind_un_id | head_of_hh | ind_first_name_ar | ind_last_name_ar | ind_first_name_en | ind_last_name_en | ind_gender | dob | ind_status | ind_date_added | user_id | system_date |
|---------------|--------------|--------------------|-------------------|-------------|-----------|------------|-------------------|------------------|-------------------|------------------|------------|------------|------------|----------------------|---------|----------------------|
| 1 | 12 | 3 | 1 | 321 | (null) | no | u | x | (null) | (null) | Male | 2012-01-01 | Active | 2018-07-19T00:00:00Z | 1 | 2018-07-19T00:00:00Z |
| 2 | 12 | 1 | 2 | 123 | (null) | no | x | y | (null) | (null) | Female | 1998-03-05 | Active | 2015-03-05T00:00:00Z | 1 | 2015-03-05T00:00:00Z |
| 3 | 12 | 3 | 1 | 1234 | (null) | no | x | z | (null) | (null) | Female | 2004-04-05 | Active | 2018-04-11T00:00:00Z | 1 | 2018-04-11T00:00:00Z |
所有 3 个字段都应插入表中individual_history
,并ind_action
设置为我在上面添加的注释。
我需要从 table 插入一个名为individual_history
values of a SELECT
query 的表individual
。
这是查询:
INSERT INTO individual_history
(individual_id,
household_id,
family_relation_id_history,
marital_status_id_history,
ind_lmms_id_history,
ind_un_id_history,
head_of_hh_history,
ind_first_name_ar_history,
ind_last_name_ar_history,
ind_first_name_en_history,
ind_last_name_en_history,
ind_gender_history,
dob_history,
ind_status_history,
ind_action,
ind_date_changed,
user_id,
system_date)
VALUES ((SELECT i.individual_id,
i.household_id,
i.family_relation_id,
i.marital_status_id,
i.ind_lmms_id,
i.ind_un_id,
i.head_of_hh,
i.ind_first_name_ar,
i.ind_last_name_ar,
i.ind_first_name_en,
i.ind_last_name_en,
i.ind_gender,
i.dob,
i.ind_status
FROM individual i
WHERE i.household_id = :hid),
'HH Status Changed to inactive',
(SELECT i.ind_date_added,
i.user_id
FROM individual i
WHERE i.household_id = :hid),
:systemDate)
正如您从查询中看到的那样,我将SELECT
语句分成两部分,因为我想插入一条特定的ind_action
消息,然后我将继续获取其他 2 个字段date added
和user_id
.
是systemDate
函数now()
结果。
我尝试使用 12 as 运行此查询hid
,但收到以下错误:
1136 - 列计数与第 1 行的值计数不匹配
经过几次搜索后,我发现我应该为每个值添加括号。所以我将查询更改为:
INSERT INTO individual_history
(individual_id,
household_id,
family_relation_id_history,
marital_status_id_history,
ind_lmms_id_history,
ind_un_id_history,
head_of_hh_history,
ind_first_name_ar_history,
ind_last_name_ar_history,
ind_first_name_en_history,
ind_last_name_en_history,
ind_gender_history,
dob_history,
ind_status_history,
ind_action,
ind_date_changed,
user_id,
system_date)
VALUES ((SELECT i.individual_id,
i.household_id,
i.family_relation_id,
i.marital_status_id,
i.ind_lmms_id,
i.ind_un_id,
i.head_of_hh,
i.ind_first_name_ar,
i.ind_last_name_ar,
i.ind_first_name_en,
i.ind_last_name_en,
i.ind_gender,
i.dob,
i.ind_status
FROM individual i
WHERE i.household_id = 12),
( 'HH Status Changed to inactive' ),
(SELECT i.ind_date_added,
i.user_id
FROM individual i
WHERE i.household_id = 12),
( NOW() ))
但仍然得到同样的错误。
我试图计算我插入的字段数与我选择的字段数相比,它们是相同的(18 个字段)。
更新
VALUES
我通过删除子句更改了查询:
INSERT INTO individual_history
(
individual_id,
household_id,
family_relation_id_history,
marital_status_id_history,
ind_lmms_id_history,
ind_un_id_history,
head_of_hh_history,
ind_first_name_ar_history,
ind_last_name_ar_history,
ind_first_name_en_history,
ind_last_name_en_history,
ind_gender_history,
dob_history,
ind_status_history,
ind_action,
ind_date_changed,
user_id,
system_date
)
SELECT i.individual_id,
i.household_id,
i.family_relation_id,
i.marital_status_id,
i.ind_lmms_id,
i.ind_un_id,
i.head_of_hh,
i.ind_first_name_ar,
i.ind_last_name_ar,
i.ind_first_name_en,
i.ind_last_name_en,
i.ind_gender,
i.dob,
i.ind_status
FROM individual i
WHERE i.household_id=12,
'HH Status Changed to inactive',
(
SELECT i.ind_date_added,
i.user_id
FROM individual i
WHERE i.household_id=12),
now()
我收到以下错误:
1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用
在第 10 行的 ''HH 状态更改为非活动状态'附近
请注意,两个表中字段的数据类型完全相同,并且individual_history
表中包含一个自增主键。
这是一个用于检查示例数据的SQL FIDDLE 。
解决方案
您尝试执行的操作不需要两个 SELECT。如果你想为 使用一些特定的值ind_action
,只需在你的选择中替换它,就像你对now()
函数所做的一样:
INSERT INTO targetTable (col1, col2, col3, col4, colTime)
SELECT colA, colB, 'my specific string', colD, now()
FROM sourceTable WHERE colA = 12;
在这里,col3
获取字符串colTime
,now()
.
推荐阅读
- sublimetext - 用 Tab 跳出括号和括号
- ms-word - 无法使用模板删除生成的单词中的空白行
- java - 打开连接上的 UCanAccess 异常 - 引用的列上不存在 UNIQUE 约束
- excel - 仅指定非相邻列 VBA 的 INTERSECT 范围
- c# - 如何使用 Kerberos 委托在 Azure sql 上模拟用户
- java - Java代码查找两个时间之间的差异,其中时间以日期类型存储,时间以24小时格式存储
- angular - 空 base64 字符串
- azure - az login 在尝试登录以进行身份验证时出现“颁发者”错误
- c - 使用待机模式后无法刷写代码。初始化 ST-LINK 设备时出错。原因:(4) 在目标上找不到设备
- python - 用硒刮擦以运行脚本