Python MySQL: Ошибка базы данных: 1364 (HY000): поле «emp_no» не имеет значения по умолчанию

Я установил MySQL на свой рабочий стол Windows. Установка прошла успешно. Я скачал данные employees с github и добавил их на свой сервер MySql. Я подтвердил это через клиент командной строки MySQL 8.4.

Я работаю над документацией для руководства разработчика MySQL Connector/Python. Пришлось вставить данные в базу данных сотрудников. Я получаю эту ошибку: DatabaseError: 1364 (HY000): Field 'emp_no' doesn't have a default value

Ответы на этот вопрос касаются PHP, а не Python: Ошибка mysql 1364. Поле не имеет значений по умолчанию

Этот вопрос касается значений по умолчанию для Datetime: Как установить значение по умолчанию для столбца MySQL Datetime?

За исключением **config, этот код представляет собой вырезание и вставку из гиперссылки dev.mysql.com. И, кроме 'password': '****', вот код, который я использовал:

from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector

config = {
    'user': 'root',
    'password': '****',
    'host': '127.0.0.1',
    'database': 'employees'
}

cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)

add_employee = ("INSERT INTO employees "
               "(first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s)")
add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

# # Insert new employee
# cursor.execute(add_employee, data_employee)
# emp_no = cursor.lastrowid

# # Insert salary information
# data_salary = {
#   'emp_no': emp_no,
#   'salary': 50000,
#   'from_date': tomorrow,
#   'to_date': date(9999, 1, 1),
# }
# cursor.execute(add_salary, data_salary)

# # Make sure data is committed to the database
# cnx.commit()

cursor.close()
cnx.close()

Теперь я знаю, что это соединяется, потому что если я закомментирую два блока Insert, все будет работать нормально. Но вот сообщение об ошибке, когда оно работает, как указано в этом вопросе.

Traceback (most recent call last):
  File "C:\Users\User\Documents\Python\Tutorials\.venv\Lib\site-packages\mysql\connector\connection_cext.py", line 697, in cmd_query
    self._cmysql.query(
_mysql_connector.MySQLInterfaceError: Field 'emp_no' doesn't have a default value

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "c:\Users\User\Documents\Python\Tutorials\Add_to_Employees.py", line 27, in <module>
    cursor.execute(add_employee, data_employee)
  File "C:\Users\User\Documents\Python\Tutorials\.venv\Lib\site-packages\mysql\connector\cursor_cext.py", line 372, in execute
    result = self._cnx.cmd_query(
             ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\User\Documents\Python\Tutorials\.venv\Lib\site-packages\mysql\connector\opentelemetry\context_propagation.py", line 102, in wrapper
    return method(cnx, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\User\Documents\Python\Tutorials\.venv\Lib\site-packages\mysql\connector\connection_cext.py", line 705, in cmd_query
    raise get_mysql_exception(
mysql.connector.errors.DatabaseError: 1364 (HY000): Field 'emp_no' doesn't have a default value

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что не следует помещать свой пароль в файл. Я пытаюсь решить одну проблему за раз.

Обновлено:
Когда я ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT; в клиенте командной строки MySQL 8.4, я получаю эту ошибку:

ERROR 1833 (HY000): Cannot change column 'emp_no': used in a foreign key constraint 'dept_manager_ibfk_1' of table 'employees.dept_manager'

Вот TABLE DEFINITON

Вы не опубликовали схему, поэтому вам, возможно, придется применить к ней некоторую интерпретацию. Ваш запрос add_employee содержит имя, дату, дату рождения и т. д., но не emp_no. MySQL предполагает, что в схеме установлено значение по умолчанию, которое он может использовать, но вы его не определили. Скорее всего вам нужно установить emp_no на AUTO_INCREMENT, чтобы присваивались уникальные номера сотрудников.

Tangentially Perpendicular 27.05.2024 01:52

Покажите нам определение таблицы для employees. Могу поспорить, что у него есть обязательный столбец emp_no, но ваш оператор вставки не предоставил для него значения.

John Gordon 27.05.2024 01:56

Спасибо вам обоим. Это дает мне направление, в котором следует двигаться дальше.

David Collins 27.05.2024 01:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что проблема начинается с таблицы сотрудников базы данных MySQL. В этой таблице нет значения по умолчанию или автоматического приращения для emp_no. Поэтому вам придется добавить emp_no вручную при вставке данных, как показано ниже:

add_employee = ("INSERT INTO employees "
               "(emp_no, first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s, %s)")

Альтернативно вы можете изменить таблицу, указав emp_no в качестве поля автоматического приращения:

ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT;

Или удалите таблицу и создайте ее заново с автоматическим приращением emp_no:

DROP TABLE employees;

CREATE TABLE employees (
    emp_no INT NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    hire_date DATE,
    gender ENUM('M', 'F'),
    birth_date DATE,
    PRIMARY KEY (emp_no)
);

Я ALTER TABLE из клиента командной строки MySQL 8.4 или из сценария Python? Является ли изменение постоянным или оно длится только до тех пор, пока включено текущее соединение.

David Collins 27.05.2024 02:54

Сделайте это с помощью командной строки MySQL 8.4, потому что нет смысла делать это с помощью скрипта Python. Как только это будет сделано, это не нужно делать снова. Это навсегда меняет таблицу.

Thisal 27.05.2024 04:06

Я изменил вопрос с ошибкой, когда ALTER TABLE в клиенте командной строки MySQL 8.4, и опубликовал определение таблицы.

David Collins 27.05.2024 04:19

написал еще один ответ, потому что он был слишком длинным для комментария.

Thisal 27.05.2024 04:39
Ответ принят как подходящий
ERROR 1833 (HY000): Cannot change column 'emp_no': used in a foreign key constraint 'dept_manager_ibfk_1' of table 'employees.dept_manager'

Вы получаете эту ошибку, поскольку emp_no уже является внешним ключом в следующих таблицах:

  • dept_emp
  • зарплаты
  • отдел_менеджер
  • титулы

Вам необходимо временно удалить эти ограничения внешнего ключа, изменить столбец, а затем повторно добавить ограничения.

  1. Отбросьте ограничения внешнего ключа.

     ALTER TABLE dept_emp DROP FOREIGN KEY dept_emp;
     ALTER TABLE dept_manager DROP FOREIGN KEY dept_manager;
     ALTER TABLE salaries DROP FOREIGN KEY salaries;
     ALTER TABLE titles DROP FOREIGN KEY titles;
    
  2. Измените столбец emp_no.

     ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT;
    
  3. Повторно добавьте удаленные внешние ключи в таблицы.

     ALTER TABLE dept_emp ADD CONSTRAINT dept_emp FOREIGN KEY (emp_no) REFERENCES employees(emp_no);
     ALTER TABLE dept_manager ADD CONSTRAINT dept_manager FOREIGN KEY (emp_no) REFERENCES employees(emp_no);
     ALTER TABLE salaries ADD CONSTRAINT salaries FOREIGN KEY (emp_no) REFERENCES employees(emp_no);
     ALTER TABLE titles ADD CONSTRAINT titles FOREIGN KEY (emp_no) REFERENCES employees(emp_no);
    

Возможно это поможет https://kedar.nitty-witty.com/blog/mysql-change-datatype-column-foreign-key-constraint

После того как я добавлю ВНЕШНИЙ КЛЮЧ после удаления ВНЕШНЕГО КЛЮЧА, будут ли восстановленные таблицы содержать ту же информацию, что и изначально?

David Collins 27.05.2024 05:02

Да, это не влияет ни на какие строки данных.

Thisal 27.05.2024 05:08

Другие вопросы по теме