Я установил 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
Покажите нам определение таблицы для employees. Могу поспорить, что у него есть обязательный столбец emp_no, но ваш оператор вставки не предоставил для него значения.
Спасибо вам обоим. Это дает мне направление, в котором следует двигаться дальше.






Я думаю, что проблема начинается с таблицы сотрудников базы данных 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? Является ли изменение постоянным или оно длится только до тех пор, пока включено текущее соединение.
Сделайте это с помощью командной строки MySQL 8.4, потому что нет смысла делать это с помощью скрипта Python. Как только это будет сделано, это не нужно делать снова. Это навсегда меняет таблицу.
Я изменил вопрос с ошибкой, когда ALTER TABLE в клиенте командной строки 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'
Вы получаете эту ошибку, поскольку emp_no уже является внешним ключом в следующих таблицах:
Вам необходимо временно удалить эти ограничения внешнего ключа, изменить столбец, а затем повторно добавить ограничения.
Отбросьте ограничения внешнего ключа.
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;
Измените столбец emp_no.
ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT;
Повторно добавьте удаленные внешние ключи в таблицы.
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
После того как я добавлю ВНЕШНИЙ КЛЮЧ после удаления ВНЕШНЕГО КЛЮЧА, будут ли восстановленные таблицы содержать ту же информацию, что и изначально?
Да, это не влияет ни на какие строки данных.
Вы не опубликовали схему, поэтому вам, возможно, придется применить к ней некоторую интерпретацию. Ваш запрос
add_employeeсодержит имя, дату, дату рождения и т. д., но не emp_no. MySQL предполагает, что в схеме установлено значение по умолчанию, которое он может использовать, но вы его не определили. Скорее всего вам нужно установитьemp_noнаAUTO_INCREMENT, чтобы присваивались уникальные номера сотрудников.