我正在使用带有连接的select语句来尝试将列插入到mySQL数据库表中。
我的代码:
insert into trips_last_arrival_time(start_time)
select min_arrival_time.start_time
from min_arrival_time
inner join trips_last_arrival_time
on min_arrival_time.trip_id = trips_last_arrival_time.trip_id;
我得到了:
[Err] 1364 - Field 'trip_id' doesn't have a default value
trip_id is the primary key of both tables.
start_time列为空,未填充空值。
我也尝试过UPDATE子句
update trips_last_arrival_time
set trips_last_arrival_time.start_time = (
select start_time from min_arrival_time )
where exists(
select trip_id from trips_last_arrival_time
where trips_last_arrival_time.trip_id = min_arrival_time.trip_id)
表min_arrival_time中有一个列trip_id(实际上它是两个表的主键!) 但是这个UPDATE子句给了我:
[Err] 1054 - Unknown column 'min_arrival_time.trip_id' in 'where clause'
我错过了什么?
答案 0 :(得分:1)
你有几个问题。
在第一次更新查询中,问题是trip_id是主键,但没有获得默认值。这应该声明为auto_increment,以便您可以轻松插入新值。 create table语句应该类似于:
trip_id int NOT NULL AUTO_INCREMENT,
. . .
primary key (trip_id)
您可以使用alter table语句修复此问题,例如:
ALTER TABLE trips_last_arrival_time CHANGE trip_id trip_id UNSIGNED NOT NULL AUTO_INCREMENT;
更新语句的问题不同。格式化,所以我可以阅读它:
update trips_last_arrival_time
set trips_last_arrival_time.start_time = (
select start_time from min_arrival_time )
where exists(select trip_id
from trips_last_arrival_time
where trips_last_arrival_time.trip_id = min_arrival_time.trip_id
)
WHERE子句指的是一个表min_arrival_time,它不在FROM子句中而不在外部查询中。相反,它在另一个子查询中。此引用是超出上下文的,这会导致您的错误。
答案 1 :(得分:1)
您正尝试在现有行上插入(因为您尝试选择它而存在)。无论trip_id
是否具有默认值,这都不是正确的操作。你需要做一个更新。
对于您的更新,我很确定您需要这样做:
UPDATE trips_last_arrival_time AS t, min_arrival_time AS m
SET t.start_time = m.start_time
WHERE t.trip_id = m.trip_id;
答案 2 :(得分:0)
在我看来,您已将trip_id
设置为表trips_last_arrival_time
的主键,该表不能为null
且没有默认值。您是否手动生成自己的trip_id
?如果没有,请将trip_id
列AUTO_INCREMENT
设为编辑,以便每次插入新记录时,服务器都会自动为您生成trip_id
。确保如果将其设置为AUTOINCREMNT
列,则其数据类型应为int
。
ALTER TABLE trips_last_arrival_time CHANGE trip_id UNSIGNED AUTO_INCREMENT;
您的更新查询看起来很复杂,请尝试简单一点
UPDATE trips_last_arrival_time a
INNER JOIN min_arrival_time b
ON a.trip_id = b.trip_id
SET a.start_time = b.start_time