我创建了两个表和一个存储过程,并用java调用存储过程,希望实现用户输入一个对应的“会员ID”以后删除两个表中具有相同“会员ID”的行,但是无论我输入什么ID两个表数据都会被清空。
public class DeleteMemberGUI extends JFrame {
private JTextField memberIdField;
private JButton deleteButton;
public DeleteMemberGUI() {
memberIdField = new JTextField(10);
deleteButton = new JButton("删除");
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int memberId = Integer.parseInt(memberIdField.getText());
deleteMemberAndRebate(memberId);
}
});
JPanel panel = new JPanel();
panel.add(new JLabel("会员ID:"));
panel.add(memberIdField);
panel.add(deleteButton);
add(panel);
setTitle("Delete_Member_And_Rebate");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void deleteMemberAndRebate(int memberId) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/first?useSSL=false&serverTimezone=UTC", "root", "lwj20021227");
PreparedStatement deleteStmt = conn.prepareStatement("CALL Delete_Member_And_Rebate(?)");
deleteStmt.setInt(1, memberId);
deleteStmt.executeUpdate();
conn.close();
JOptionPane.showMessageDialog(null, "会员和相关返利数据删除成功");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "删除会员和返利数据时发生错误");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DeleteMemberGUI();
}
});
}
}
以下是sql语句
-- 创建会员基本信息表(Member_Information)
CREATE TABLE Member_Information (
Member_ID INT PRIMARY KEY, -- 会员ID,主键
Name VARCHAR(50), -- 姓名
Gender VARCHAR(10), -- 性别
Age INT, -- 年龄
Work_Place VARCHAR(100), -- 工作单位
Contact VARCHAR(15) -- 联系方式
);
-- 创建会员返利信息表(Member_Rebate)
CREATE TABLE Member_Rebate (
Rebate_ID INT PRIMARY KEY, -- 返利信息ID,主键
Member_ID INT , -- 会员ID,外键,关联到会员基本信息表的会员ID
Points INT, -- 会员积分情况
Discount_Level VARCHAR(50), -- 享受优惠等级
Goods_Traffic VARCHAR(50), -- 货物流量
Consumer_Group VARCHAR(50) -- 消费人群
);
--存储过程
DELIMITER //
CREATE PROCEDURE Delete_Member_And_Rebate(IN member_id INT)
BEGIN
-- 删除会员返利信息表中具有指定会员ID的行
DELETE FROM Member_Rebate WHERE Member_ID = member_id;
-- 删除会员基本信息表中具有指定会员ID的行
DELETE FROM Member_Information WHERE Member_ID = member_id;
SELECT ROW_COUNT() AS deleted_rows;
END //
DELIMITER ;
变量member_id你能换个名字吗,和表的字段Member_ID一样的,那不where true了吗
【以下回答由 GPT 生成】
为了保证只删除具有相同会员ID的行,而不是清空所有数据,可以对存储过程进行修改。
首先,需要查看存储过程的具体代码,找到删除表的逻辑。如果存储过程中使用了DELETE语句删除表中的所有数据,需要对其进行修改。可以通过添加WHERE子句来限制只删除具有相同会员ID的行。
假设存储过程中删除表的代码如下:
DELETE FROM 表名;
我们可以修改为:
DELETE FROM 表名 WHERE 会员ID = ?;
其中,?
表示会员ID是一个参数,我们需要在Java代码中设置这个参数的值。
在Java代码中,修改如下:
private void deleteMemberAndRebate(int memberId) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/first?useSSL=false&serverTimezone=UTC", "root", "lwj20021227");
PreparedStatement deleteStmt = conn.prepareStatement("CALL Delete_Member_And_Rebate(?)");
deleteStmt.setInt(1, memberId);
deleteStmt.executeUpdate();
conn.close();
JOptionPane.showMessageDialog(null, "删除完成。");
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "删除失败。");
}
}
这样修改后,存储过程执行的删除语句将根据用户输入的会员ID来删除具有相同会员ID的行。
请注意,这只是一个示例代码,根据实际情况可能需要对代码做进一步的调整。另外,为了安全起见,建议在执行任何删除操作之前,先备份数据。
【相关推荐】