【问题标题】:Inserting into one table from two different tables with auto-increment value从具有自动增量值的两个不同表中插入一个表
【发布时间】:2019-05-05 09:20:31
【问题描述】:

我正在从两个不同的表中插入一个表:

在我的driver 表中,我需要将driverID 作为外键driverID_FK 插入到我的car 表中。

同时,我需要将brandcolorwheel从我的manufacturer表插入到我的car表中。

我的桌子:

DRIVER
(driverID, name, age, ...)

CAR
(carID, driverID_FK, brand, color, wheel)

MANUFACTURER
(manufacturerID, brand, color, wheel)

我的driverID 是一个自动增量值。在我的 Web 应用程序中,我想要插入到 car 表中的行之前或之后可能还有其他条目,因此它不一定是我的 driver 表中的最后插入行。我的manufacturer 表中的brand, color, wheel 值也是如此。

到目前为止,这是我准备好的 SQL:

String name = //taken from another method...
int manufacturerID = //taken from another method...

String sql = "INSERT INTO car (driverID_FK, brand, color, wheel) 
+ SELECT driverID FROM driver WHERE name = ?,
+ SELECT brand, color, wheel FROM manufacturer WHERE manufacturerID = ? ;";

PreparedStatement psmt = connect.prepareStatement(sql);
psmt.setString(1, name);
psmt.setInt(2, manufacturerID);
psmt.executeUpdate();
psmt.close();

非常感谢任何建议

【问题讨论】:

    标签: java mysql sql select insert


    【解决方案1】:

    查询1:获取驱动ID:

    SELECT driverID INTO @driverID
    FROM driver
    WHERE name = ?
    

    用之前的@driverID插入制造商信息:

    INSERT INTO car (driverID, brand, color, wheel)
    SELECT @driverID, brand, color, wheel
    FROM manufacturer
    WHERE manufacturerID = ?
    

    【讨论】:

    • 使用 Prepared Statement 时如何执行这两个单独的查询?我是否要声明 2 个单独的准备语句变量,然后执行每个变量?
    • 同一连接上的两个单独的预处理语句。
    • 感谢您的帮助。
    【解决方案2】:

    使用 INSERT .. SELECT 语法:

    INSERT INTO car (driverID, brand, color, wheel)
    SELECT driverID, brand, color, wheel
    FROM driver, manufacturer
    WHERE name = ? AND  manufacturerID = ?
    

    【讨论】:

    • 当我测试它时,它可以工作,但是它会插入同一行 4 次。这与SQL有关吗?因为我在其他代码中到处检查,而我的函数只被调用一次,所以它应该只插入一次行。
    • 它可能是查询。我稍微猜测了一下。附加LIMIT 1 有帮助吗?
    • 是的,LIMIT 1 使它只插入一行。我很好奇你的查询在哪里使它插入多行......
    • 作为一个逗号,它实际上是一个没有连接条件的连接。我会做一个更好的答案,因为我什至不喜欢这个(我总是讨厌没有标准的加入)。
    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多