【问题标题】:Trying to insert column of data into mySQL table试图将数据列插入到 mySQL 表中
【发布时间】:2012-08-16 02:10:23
【问题描述】:

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

我错过了什么?

【问题讨论】:

    标签: mysql select insert


    【解决方案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】:

      你有几个问题。

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

      【讨论】:

      • 戈登,感谢您的洞察力。我将根据您的 cmets 测试对此的一些修改,我会回复您。我很欣赏关于更新失败原因的见解。
      【解决方案3】:

      在我看来,您已将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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-01
        • 2010-12-01
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多