0 / 0 / 0
Регистрация: 12.10.2020
Сообщений: 62
1

Java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null

11.06.2023, 17:55. Показов 799. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, делаю проект банкомат, но выдает ошибку java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null.

У меня всего 4 класса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public class Account {
 
 
    
    private String firstName;
    
    private String lastName;
    
    private Integer balance;
    
    Account(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    /*
    Registration of new user
    */
    public Boolean register() {
        try {
            Connection c = Database.connection();
            
            Statement stmt = c.createStatement();
            
            String sql = "INSERT INTO account VALUES (null, '" + this.firstName + "', '" + this.lastName + "')";
            
            stmt.executeUpdate(sql);
            
            
            Statement stmt2 = c.createStatement();
            String sql2 = "SELECT LAST_INSERT_ID()";
            ResultSet rs2 = stmt.executeQuery(sql2);
            
            Integer last_account_id = 0;
            
            while (rs2.next()) {
                last_account_id = rs2.getInt(1);
            }
            
            String cardNumber = this.generateCardNumber();
            
            String code = this.generatePincode();
            
            Statement stmt3 = c.createStatement();
            
            String sql3 = "INSERT INTO card VALUES ('" + last_account_id + "', '" + cardNumber + "', '" + code + "')";
            
            stmt3.executeUpdate(sql3);
            
            
            Statement stmt4 = c.createStatement();
            
            String sql4 = "INSERT INTO balance VALUES ('" + cardNumber + "', '0')";
            
            stmt4.executeUpdate(sql4);
            
            
            c.close();
            
            
            System.out.println("Account created successfully");
            
            System.out.println("Card number: " + cardNumber);
            
            System.out.println("Pincode: " + code);
            
            
            return true;
        } catch (Exception e) {
            System.out.println(e);
        }
        
        return false;
    }
    
    /*
    Card number generation
    */
    public String generateCardNumber() {
        Integer length = 8;
        
        String passwordSet = "1234567890";
        
        char[] cardNumber = new char[length];
        
        for (int i = 0; i < length; i++) {
            int rand = (int) (Math.random() * passwordSet.length());
            
            cardNumber[i] = passwordSet.charAt(rand);
        }
        
        return new String(cardNumber);
    }
    
    /*
    Pin code generation
    */
    public String generatePincode() {
        Integer length = 4;
        
        String passwordSet = "1234567890";
        
        char[] cardNumber = new char[length];
        
        for (int i = 0; i < length; i++) {
            int rand = (int) (Math.random() * passwordSet.length());
            
            cardNumber[i] = passwordSet.charAt(rand);
        }
        
        return new String(cardNumber);
    }
        
        
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
public class BasicAtm {
    
    public static boolean isLogin = false;
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Integer option = 0;
        
        Scanner scanner = new Scanner(System.in);
        
        //Displaying the main menu
        while (option == 0) {
            System.out.println("==== SELECT AN OPTION ====");
            System.out.println("1. Create an account");
            System.out.println("2. Sign in\n");
            
            while (option < 1 || option > 2) {
                System.out.println("Type your choice: ");
                
                option = scanner.nextInt();
            }
        }
        
        //Data entry depending on the selected option
        switch(option) {
            case 1: //Creating a new account
                System.out.println("\n\n=== CREATE NEW ACCOUNT ===\n");
                
                System.out.println("Enter first name:");
                
                String firstName = scanner.next().trim();
                
                System.out.println("Enter last name:");
                
                String lastName = scanner.next().trim();
                
                
                Account account = new Account(firstName, lastName);
                
                account.register();
                
                break;
            
            case 2: //Login to an existing account
                System.out.println("\n\n==== SIGN IN ====\n");
                
                System.out.println("Enter your card number: ");
                
                String cardNumber = scanner.next();
                
                System.out.println("Enter your pincode: ");
                
                String pincode = scanner.next();
                
                Operation operation = new Operation(cardNumber, pincode);
                
                //Checking that the user exists
                try {
                    Connection c = Database.connection();
                    
                    Statement stmt4 = c.createStatement();
                    
                    String sql4 = "SELECT * FROM card WHERE card_number = '" + cardNumber + "' AND pincode = '" + pincode + "'";
                    
                    ResultSet rs4 = stmt4.executeQuery(sql4);
                    
                    //Display the menu of the user who is logged in
                    if (rs4.next()) {
                        isLogin = true;
                        
                        System.out.println("\n\n==== LOGIN SUCCESS ====\n");
                        
                        System.out.println("--- Enter an option ---");
                        
                        System.out.println("1. Balance");
                        System.out.println("2. Deposit");
                        System.out.println("3. Send to other person");
                        
                        Integer option_user = 0;
                        
                        while (option_user < 1 || option_user > 3) {
                            System.out.println("\nType your choice: ");
                            
                            option_user = scanner.nextInt();
                        }
                        
                        Integer balance = 0;
                        
                        //Data entry depending on the selected option
                        switch(option_user) {
                            case 1:
                                System.out.println("\n\n==== SHOW BALANCE ====\n");
                                
                                balance = operation.showBalance(cardNumber);
                                
                                System.out.println(balance);
                                
                                break;
                            case 2:
                                System.out.println("\n\n==== MAKE DEPOSIT ====\n");
                                
                                Integer amount = 0;
                                
                                while (amount <= 0) {
                                    System.out.println("Type amount: ");
                                    
                                    amount = scanner.nextInt();
                                }
                                
                                operation.deposit(amount, cardNumber);
                                
                                balance = operation.showBalance(cardNumber);
                                
                                System.out.println("\nCurrent balance is " + balance);
                                
                                break;
                                
                            case 3:
                                System.out.println("\n\n==== SEND MONEY TO OTHER CARD ====\n");
                                
                                System.out.println("Enter number of other client: ");
                                
                                String number_other = scanner.next();
                                
                                Integer amountOther = 0;
                                
                                while (amountOther <= 0) {
                                    System.out.println("Enter amount for other client: ");
                                    
                                    amountOther = scanner.nextInt();
                                }
                                
                                operation.sendMoneyToOther(amountOther, number_other, cardNumber);
                                
                                System.out.println("\nYou've sent " + amountOther + " to " + number_other);
                                
                                break;
                            
                            default:
                                break;
                        }
                        
                    } else {
                        System.out.println("\nLogin fail");
                    }
                } catch (Exception e) {
                    
                }
                break;
                
            default:
               break;
            
            
        }
    }
    
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Database {
    private static final String dbClassName = "com.mysql.cj.jdbc.Driver";
    
    private static final String CONNECTION = "jdbc:mysql://localhost:3306/java";
    
    private static final String USER = "root";
    
    private static final String PASSWORD = "password";
    
    public static java.sql.Connection connection() throws Exception {
        Class.forName(dbClassName);
        
        return DriverManager.getConnection(CONNECTION, USER, PASSWORD);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class Operation {
    private String cardNumber;
    
    private String pincode;
    
    private Integer balance;
    
    Operation(String cardNumber, String pincode) {
        this.cardNumber = cardNumber;
        this.pincode = pincode;
    }
    
    /*
    Displaying the balance of the bank card
    */
    public Integer showBalance(String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt5 = c.createStatement();
            
            String sql5 = "SELECT * FROM balance WHERE card_number = " + cardNumber;
            
            ResultSet rs5 = stmt5.executeQuery(sql5);
            
            while (rs5.next()) {
                this.balance = rs5.getInt(2);
            }
            
        } catch (Exception e) {
            System.out.println(e);
        }
        
        return this.balance;
    }
    
    
    /*
    Put money on a bank card
    */
    public void deposit(Integer amount, String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt6 = c.createStatement();
            
            String sql6 = "UPDATE balance SET balance = balance + '" + amount + "' WHERE card_number = " + cardNumber;
            
            stmt6.executeUpdate(sql6);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    
    /*
    Transfer money to another user
    */
    public void sendMoneyToOther(Integer amountOther, String numberOther, String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt8 = c.createStatement();
            
            String sql8 = "UPDATE balance SET balance = balance + " + amountOther + " WHERE card_number = '" + numberOther + "'";
            
            stmt8.executeUpdate(sql8);
            
            
            Statement stmt9 = c.createStatement();
            
            String sql9 = "UPDATE balance SET balance = balance - " + amountOther + " WHERE card_number = '" + cardNumber + "'";
            
            stmt9.executeUpdate(sql9);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2023, 17:55
Ответы с готовыми решениями:

Вылетает ошибка java.sql.SQLException: Column 'id' not found
При попытке получения данных из MySQl вылетает ошибка java.sql.SQLException: Column 'id' not found....

Column 'genmark' cannot be null The SQL being executed was: INSERT
Есть две пустые таблицы parimatch и finalparimatch в parimatch есть колонка genmark в которой...

Cannot insert the value NULL into column 'Id', table '.dbo.Records';column does not allow nulls
Уважаемые, т.к. мой мозг не способен понять, почему вылазит данное исключение, когда я добавляю...

UPDATE SELECT, ERROR: null value in column violates not-null constraint
Здравствуйте. Две таблицы, из одной значением integer модифицируется int другой таблицы. В...

Null value in column "user_id" violates not-null constraint save()
Хочу сделать импорт данных из файла Excel. все данные берутся нормально но он выдает ошибку, сам...

3
98 / 75 / 25
Регистрация: 17.03.2023
Сообщений: 161
12.06.2023, 14:28 2
конечно, у вас null в стейтменте

String sql = "INSERT INTO account VALUES (null, '" +

пользуйтесь хайбернетом
1
0 / 0 / 0
Регистрация: 12.10.2020
Сообщений: 62
13.06.2023, 19:40  [ТС] 3
IOException, спасибо, я оставил то что написал, просто пересоздал базу данных create table account ( id INT AUTO_INCREMENT PRIMARY KEY, first_name varchar(255), last_name varchar(255)
0
98 / 75 / 25
Регистрация: 17.03.2023
Сообщений: 161
13.06.2023, 22:52 4
Лучший ответ Сообщение было отмечено master_arduino как решение

Решение

вот и отлично, сами нашли решение.

Однако, я бы не советовал писать SQL стейтменты вручную. Это может создавать множество проблем в том числе серьёзных и в том числе касающихся безопасности.

Банальный пример:

String sql = "INSERT INTO account VALUES (null, '" + this.firstName + "', '" + this.lastName + "')";

в итоге будет стейтмент

INSERT INTO account VALUES (null, 'firstname', 'lastname');

допустим имя вводится через некий формуляр пользователем.
допустим некий злоумышленник вместо имени вводит туда следующее:

'; DROP TABLE account;

в итоге получается такой стейтмент
INSERT INTO account VALUES (null, ''; DROP TABLE account; ', 'lastname');

тоесть это три стейтмента. Первый и последний выкинут ощибку, а вот который посередине сотрет всю таблицу account и ваша база уничтожена.

Существуют конечно методы защиты параметров и прочие фокусы типа PreparedStatement, однако на практике используются специализированные библиотеки для решения задач объектно-реляционного отображения (ORM), самая популярная реализация спецификации JPA для явы является hibernate. Во первых hibernate защитит базу от подобных взломов без вашего активного участия. Взломать hibernate можно, но если она используется корректно, это достаточно сложно. Далее hibernate поможет обнаружить ощибки уже при программировании на уровне компайлера, а не только при тестировании. Ну и что самое главное, поможет избавиться от зависимости между сервисом и базой. Всмысле вы можете взять любую другую базу данных, и вам не нужно будет коррегировать ваши SQL стейтменты для совместимости с другой базой. hibernate переведет всё автоматически в специфический формат другой базы. Это очень важно чтобы ваш код не зависил от того какую именно базу вы используете.

Если вы серьезно работаете с базами данных, могу только посоветовать ознакомится с темами JPA, Hibernate и неплохо бы Criteria API.

Для начало это быть может кажется всё достаточно сложно, но зато профессионально и надёжно.

Добавлено через 28 минут
Цитата Сообщение от master_arduino Посмотреть сообщение
create table account ( id INT AUTO_INCREMENT PRIMARY KEY, first_name varchar(255), last_name varchar(255)
вот ещё пример. С hibernate вам не нужно больше создавать таблицы или манипулировать базой вручную. Вы просто пишите особенный класс, т.н. сущность Account. Если угодно Hibernate создаст таблицу в базе автоматически исходя из вашей реализации класса Account.

В вашем случае напр. реализация сущности Account будет выглядеть примерно так

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Entity
public class Account {
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String firstName;
 
    private String lastName;
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
то есть вы пишите банальный поджо и добавляете некоторые аннотации. Типа что поле id это ключь и что он генерируется автоматически самой базой. В итоге hibernate проверит есть ли уже таблица подходящяя под эту сущность и если нет создаст её используя корректный и надёжный стейтмент.
0
13.06.2023, 22:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2023, 22:52
Помогаю со студенческими работами здесь

Ошибка: null value in column
Добрый день, подключаю к C# базу Postgresql делаю добавление полей выводит ошибку: &quot;23502: null...

Проблема: Integrity constraint violation: 1048 Column 'any' cannot be null
Добрый день! Изучаю Zend и выполняя одно задание столкнулся со следующей проблемой: Имеется...

SpringBoot REST API error: Column cannot be null (Kotlin)
Есть 2 класса: User и Ticket. Они связаны OneToMany. Из-за чего выдает такое при удалении ticket...

Двойная сортировка null и not null + rand() sql
Имеется таблица items id | name | text | is_top | top_pos 1 | name | text | 1 | 1 2...

Исключение "Column contains NULL data" при заполнении полей на форме
Здравствуете. Пытаюсь извлечь данные из БД (Oracle), и разместить полученные значения в textbox'ы....

Указание Id и исключение "Cannot insert the value NULL into column 'Id'"
Всем привет, ребят нужна ваша помощь.Я недавно начал изучать asp.net и у меня проблема. Я создал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru