mysql - Django CharField 作为主键仍然允许保存 Null 值
问题描述
目前我有以下模型,我想将 CharField 设置为主键(我的数据库是 Mysql)
class Customer(models.Model):
class Meta:
db_table = "customers"
verbose_name = _('Customer')
verbose_name_plural = _('Customers')
customer_id = models.CharField(_('Customer ID'),max_length=255, primary_key=True)
name = models.CharField(_('Name'), max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
在文件中它指出:
primary_key=True 意味着 null=False 和 unique=True。一个对象只允许有一个主键。
在 Mysql 中,主键具有以下结构:
customer_id, type=varchar(255), collation=latin1_swedish_ci, Attributes=blank Null=No, Default=None,Comments=blank, Extra=blank
但是当我尝试对主键使用 null 值的 save() 方法时:
Customer.objects.create(customer_id=None, name="abc")
它仍然在主键中保存 Null 值而不返回任何错误或验证,这是为什么呢?
编辑: 在 Mysql 中保存后,它会显示 customer_id=blank 的值(当尝试将其保存为 None 时)。为什么保存customer_id=None时设置为空白?
解决方案
当您第一次创建对象时
Customer.objects.create(customer_id=None, name="abc")
它将customer_id
值存储为 ''(空值,不是 null),并且到目前为止我们还没有创建其他对象,因此它也是唯一的。
现在,当您再次创建 Customer 对象时
Customer.objects.create(customer_id=None, name="xyz")
这将引发错误django.db.utils.IntegrityError: UNIQUE constraint failed: customers.customer_id
,因为我们的值中已经有空customer_id
值。所以,这会引发 UNIQUE 约束的错误
推荐阅读
- python - 在断开连接之前等待读取命名管道
- laravel - 如何使路由接受 # 以访问长页面中的各个段落
- sql-server - 使用 cluster.exe 为 MS SQL 故障转移 AOAG 创建批处理脚本
- android - 三星可穿戴 Tizen 应用拒绝无深层链接
- cmake - CMake - 将 add_library 设置为 SHARED 会导致致命错误 U1073:不知道如何制作
- c# - 如果 XML 文件不再可用,C# 会中断 XML 读取功能
- excel - VBA SpecialCells 代码适用于家用电脑,但不适用于工作电脑
- google-api - GSuite - 使用非管理员访问令牌检索组织中的组
- android - 我如何设计一个移动应用程序来跟踪其他应用程序
- c - 使用 STM32 HAL 的 I2C 通信问题