Как написать запрос весной для вставки записей в 2 таблицы в базе данных Mysql - PullRequest
0 голосов
/ 18 октября 2019

Я хочу написать запрос для вставки данных в две таблицы.

Я вставляю данные в две таблицы, известные как User и company. User имеет внешний ключ company _id. Структура таблицы задана как

Таблица пользователей

  • int user_id; (AI)
  • int company_id;(внешний ключ)
  • Строка user_name;
  • Строка user_email;

Таблица компании

  • int company_id; (AI)
  • Строка company_name;

-

void insert(String user){
    String query="insert into user(user_name,user_email,company_id,company_name) values
    (variable,variable, variable, variable)";
    //code to map using put method
}

Я получаю ошибку

company_id cannot be null.

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Поскольку внешний ключ company_id не может быть null, компания должна существовать в БД, и ее идентификатор должен быть известен, прежде чем вы сможете вставить пользователя.

ОБНОВЛЕНИЕ

Комувведите нового пользователя, вам нужно:

  • имя пользователя
  • адрес электронной почты
  • название компании

Сначала мынеобходимо найти company_id для данного названия компании. Если он не найден в базе данных, добавляется новая компания.

public void insertUser(String userName, String userEmail, String companyName)
        throws SQLException {
    int companyId = getOrInsertCompany(companyName);
    try (PreparedStatement stmt = cnt.prepareStatement(
            "insert into User(company_id,user_name,user_email)"
            + " values(?,?,?)")) {
        stmt.setInt(1, companyId);
        stmt.setString(1, userName);
        stmt.setString(1, userEmail);
        stmt.executeUpdate();
    }
}

private int getOrInsertCompany(String companyName) throws SQLException {
    try (PreparedStatement stmt = cnt.prepareStatement(
            "select company_id from Company where company_name=?")) {
        stmt.setString(1, companyName);
        try (ResultSet rs = stmt.executeQuery()) {
            if (rs.next()) {
                return rs.getInt(1);
            }
        }
    }
    // the company was not found; insert it
    try (PreparedStatement stmt = cnt.prepareStatement(
            "insert into Company(company_name) values(?)")) {
        stmt.setString(1, companyName);
        stmt.execute();
        try (ResultSet rs = stmt.getGeneratedKeys()) {
            if (!rs.next()) {
                throw new SQLException(
                        "Could not get generated keys");
            }
            return rs.getInt(1);
        }
    }
}
0 голосов
/ 18 октября 2019

Проверка ограничения NOT NULL

SELECT * FROM INFORMATION_SCHEMA.COLUMNS where table_name = 'user' and column_name = 'company_id';

Если значение is_nullable равно NO, то вы не можете вставить нулевое значение.

Либо измените ограничение на NULLили проверьте (не нулевое значение) ваше значение для company_id.

Синтаксис для изменения ограничения с NOT NULL на NULL

ALTER TABLE YourTable ALTER COLUMN YourColumn columnType NULL
0 голосов
/ 18 октября 2019

Это, вероятно, потому что company_id в таблице user установлено на not null. Вы должны удалить not null из столбца company_id в операторе создания таблицы таблицы user, если хотите, чтобы внешний ключ обнулялся. В противном случае вы должны указать значение для внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...