0

我正在使用带有连接的 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'

我错过了什么?

4

3 回答 3

1

你有几个问题。

在您的第一个更新查询中,问题是trip_id 是主键,但没有获得默认值。这应该声明为 auto_increment 以便您可以轻松插入新值。创建表语句应该是这样的:

 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 子句中,也不在外部查询中。相反,它在另一个子查询中。此参考是断章取义的,这会导致您的错误。

于 2012-08-16T02:23:15.453 回答
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;
于 2012-08-16T02:27:51.700 回答
0

在我看来,您已将trip_id表的主键设置为trips_last_arrival_time不能null也没有默认值。你自己手动生成trip_id吗?如果没有,请将您的trip_id列设置为AUTO_INCREMENTed,以便每次插入新记录时,服务器都会自动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
于 2012-08-16T02:28:58.393 回答