簡體   English   中英

如何在JavaDB和prepareStatement中創建表?

[英]How to create tables in JavaDB and prepareStatement?

將“ ALTER TABLE”添加到表時,將數據添加到數據庫時出現問題。 我從正在處理的網頁上獲取信息,並將其寫入將數據信息傳輸到數據庫的java方法中。 如果我不使用兩個ALTER TABLE語句,一切都將正常工作,但是一旦添加了這兩個信息,該信息將不再進入我的數據庫。 我究竟做錯了什么? 下面列出了CREATE TABLE和Java方法。 希望可以有人幫幫我!

CREATE TABLE role(
username VARCHAR(15) NOT NULL,
password VARCHAR(15) NOT NULL,
role VARCHAR(6) NOT NULL,
CONSTRAINT username_pk PRIMARY KEY (username)
);

CREATE TABLE customer(
orgnumber INTEGER NOT NULL,
companyname VARCHAR(20) NOT NULL,
contactperson VARCHAR(20),
streetname VARCHAR(30) NOT NULL,
zipcode INTEGER NOT NULL,
city VARCHAR(15) NOT NULL,
phone CHAR(12),
email VARCHAR(30) NOT NULL,
username VARCHAR(15),
CONSTRAINT orgnumber_pk PRIMARY KEY (orgnumber)
);

CREATE TABLE place(
zipcode INTEGER NOT NULL,
city VARCHAR(15),
streetname VARCHAR(30),
CONSTRAINT place_pk PRIMARY KEY (zipcode)
);

ALTER TABLE customer
    ADD CONSTRAINT role_fk1 FOREIGN KEY (username)
        REFERENCES role;

ALTER TABLE customer
    ADD CONSTRAINT place_fk1 FOREIGN KEY (zipcode)
        REFERENCES place;

Java方法:

public boolean regNewRegister(RegBean newRegister) {
    PreparedStatement sqlnewRegister = null;
    PreparedStatement sqlnewRole = null;
    PreparedStatement sqlnewPlace = null;
    String knd = "Customer";

    OpenConnection();
    boolean ok = false;
    try {
        /*
         * A transaction is started, uses lock.
         */
        if (connection == null) {
            System.out.println("Went well");
        }
        connection.setAutoCommit(false);

        sqlnewRegister = connection.prepareStatement("insert into customer (ORGNUMBER, CNAME, CONTACTP, STREETN, ZIPC, CITY, PHONE, EMAIL, USERNAME) values(?, ?, ?, ?, ?, ?, ?, ?, ?)");
        sqlnewRegister.setInt(1, newRegister.getOrgNumber());
        sqlnewRegister.setString(2, newRegister.getCompanyName());
        sqlnewRegister.setString(3, newRegister.getContactPerson());
        sqlnewRegister.setString(4, newRegister.getStreetName());
        sqlnewRegister.setInt(5, newRegister.getZipCode());
        sqlnewRegister.setString(6, newRegister.getCity());
        sqlnewRegister.setLong(7, newRegister.getPhone());
        sqlnewRegister.setString(8, newRegister.getEmail());
        sqlnewRegister.setString(9 newRegister.getUsername());

        sqlnewRole = connection.prepareStatement("insert into role (USERNAME, PASSWORD, ROLE) values (?, ?, ?)");
        sqlnewRole.setString(1, newRegister.getUsername());
        sqlnewRole.setString(2, newRegister.getPassword());
        sqlnewRole.setString(3, knd);

        sqlnewPlace = connection.prepareStatement("insert into place (ZIPC, CITY, STREETN) values (?, ?, ?)");

        sqlnewPlace.setInt(1, newRegister.getZipCode());
        sqlnewPlace.setString(2, newRegister.getCity());
        sqlnewPlace.setString(3, newRegister.getStreetName());

        sqlnewRegister.executeUpdate();
        sqlnewRole.executeUpdate();
        sqlnewPlace.executeUpdate();

        connection.commit();

        /*
         * Transaction ended
         */
        ok = true;

    } catch (SQLException e) {
        Cleaner.rollBack(connection);
        String sqlStatus = e.getSQLState().trim();
        String statusclass = sqlStatus.substring(0, 2);
        if (statusclass.equals("23")) { // Standard code for "integrity constraint violation"
            ok = false;  // This orgnumber is already registered
        } else {
            Cleaner.writeMessage(e, "WriteToDB");
        }
    } finally {
        Cleaner.settAutoCommit(connection);
        Cleaner.closeSentence(sqlnewRegister);
        Cleaner.closeSentence(sqlnewRole);
        Cleaner.closeSentence(sqlnewPlace);
    }
    closeConnection();
    return ok;
}

您必須先插入roleplace然后才能插入customer ,否則將違反您的參照完整性。

這兩個ALTER TABLE語句意味着customer.username必須具有對應的值role.usernamecustomer.zipcode必須指向有效的place.zipcode

當您首先插入customer ,這些記錄將不存在。

編輯:

executeUpdate的順序更改為

    sqlnewRole.executeUpdate();
    sqlnewPlace.executeUpdate();
    sqlnewRegister.executeUpdate();

應該可以。

編輯2:

不過要注意一件事,如果兩個人使用相同的郵政編碼,您的代碼就會崩潰,因為如果您嘗試添加兩次,則插入place將違反主鍵...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM