2012-08-16 77 views
0

我正在使用带连接的select语句来尝试将列插入到mySQL数据库表中。尝试将数据列插入到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' 

我错过了什么?

回答

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; 
+0

水稻,非常感谢!这做到了。 – Harry 2012-08-18 00:32:55

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子句中,而不是在外部查询。相反,它在另一个子查询中。该引用不在上下文中,这会导致您的错误。

+0

戈登,感谢你的洞察。我将根据您的意见对此进行一些修改,我会尽快与您联系。我很欣赏为什么更新失败的见解。 – Harry 2012-08-19 17:05:43

0

在我看来,你已经设置trip_id如表trips_last_arrival_time的主键不能是null,没有默认值。你是否手动生成自己的trip_id?如果没有,请将您的trip_idAUTO_INCREMENT更新为每次插入新记录时,服务器会自动为您生成trip_id。确保如果将该列设置为AUTOINCREMNT,则其数据类型应为int

ALTER TABLE trips_last_arrival_time CHANGE trip_id UNSIGNED AUTO_INCREMENT; 

您更新查询看起来很复杂,尝试simplying这一点更好

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