java—以一对一关系从联接表中选择数据

f45qwnt8  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(266)

我有一个阶级梳妆台,扩展抽象阶级的家具。
这是班级家具。

public abstract class Furniture {

    private String furnishing;
    private String board;
    private String wood;
    private double mass;
    private int price;
    private int shippingPrice;

}

这是班级梳妆台。

public final class Dresser extends Furniture {

    private int width;
    private int length;
    private int height;
    private int drawers;

}

继承在表中表示为:

CREATE TABLE furnitures (
    index INTEGER NOT NULL AUTO_INCREMENT,
    furnishing VARCHAR(255) NOT NULL,
    board VARCHAR(255) NOT NULL,
    wood VARCHAR(255) NOT NULL,
    mass FLOAT(5,2) NOT NULL,
    price INTEGER NOT NULL,
    shipping_price INTEGER NOT NULL,
    PRIMARY KEY (index)
)

CREATE TABLE IF NOT EXISTS dressers (
    index INTEGER NOT NULL,
    width INTEGER NOT NULL,
    length INTEGER NOT NULL,
    height INTEGER NOT NULL,
    drawers INTEGER NOT NULL,
    PRIMARY KEY (index),
    FOREIGN KEY (index) REFERENCES furniture (index)
)

我需要建立一个查询,允许我选择一个记录或从表中选择所有记录,但到目前为止,我已经提出了这个问题,但我不知道这是否一定是最好的方法。

String query =
"SELECT furniture.board, furniture.wood, furniture.mass, " +
"furniture.price, furniture.shipping_price, " +
"dresser.width, dresser.length, dresser.height, dresser.drawers " +
"FROM furniture, dresser " +
"WHERE " +
"furniture.index = dresser.index";

这将是我选择所有记录的查询(可以安全地忽略提供字段)。
如何改进?另外,我如何进行查询来选择给定某个索引的某个记录,或者如何更新某个记录?
我在用mysql。

rmbxnbpk

rmbxnbpk1#

更新必须在两个语句中完成。您可能希望将这两条语句 Package 在一个事务中,以确保它们都成功或失败。

snz8szmq

snz8szmq2#

要仅选择特定的梳妆台,请使用

String query =
"SELECT f.board, f.wood, f.mass, f.price, f.shipping_price,    
d.width, d.length, d.height, d.drawers
FROM furniture f
JOIN dresser d ON f.index = d.index
WHERE f.index = @index"

在这里 @index 是您想要的梳妆台的索引(参见https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-parameters.html).

j1dl9f46

j1dl9f463#

我强烈建议使用 INNER JOIN 在笛卡尔积上或与 WHERE 条款。
例如:

String query = "SELECT * FROM furniture f INNER JOIN dresser d ON f.index = d.index"
dldeef67

dldeef674#

如果确实要选择所有记录(“我的查询选择所有记录”),则需要 left join ,确保您得到的家具不是梳妆台:

SELECT f.board, f.wood, f.mass, f.price, f.shipping_price,    
       d.width, d.length, d.height, d.drawers
FROM furniture f LEFT JOIN
     dresser d
     ON f.index = d.index
WHERE f.index = @index;

如果你只想要所有的梳妆台,那么 INNER JOIN 很好。

相关问题