首页 > 数据库 >MySQL的PRIMARY KEY的DEFAULT NULL问题

MySQL的PRIMARY KEY的DEFAULT NULL问题

时间:2024-12-27 20:02:48浏览次数:5  
标签:__ 默认值 DEFAULT PRIMARY CHAR KEY MySQL NULL 主键

问题展示

 代码一:

import pymysql

if __name__ == '__main__':
    conn=pymysql.connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='123123',
        charset='utf8mb4',
        db='nudt')
    cursor = conn.cursor()
    sqls=[
        '''
        create table Course(
            Cno CHAR(10) PRIMARY KEY,
            Cname CHAR(100) DEFAULT NULL,
            Tno CHAR(10) DEFAULT NULL
        )
        ''',
        '''
        create table Teacher(
            Tno CHAR(10) PRIMARY KEY,
            Tname CHAR(100) DEFAULT NULL,
            Tsex CHAR(10) DEFAULT NULL
        )
        '''
    ]
    for sql in sqls:
        cursor.execute(sql)
    cursor.close()
    conn.close()
   
   

输出结果:

 代码二:

import pymysql

if __name__ == '__main__':
    conn=pymysql.connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='123123',
        charset='utf8mb4',
        db='nudt')
    cursor = conn.cursor()
    sqls=[
        '''
        create table Course(
            Cno CHAR(10),
            Cname CHAR(100),
            Tno CHAR(10),
            PRIMARY KEY (Cno)
        )
        ''',
        '''
        create table Teacher(
            Tno CHAR(10),
            Tname CHAR(100),
            Tsex CHAR(10),
            PRIMARY KEY (Tno)
        )
        '''
    ]
    for sql in sqls:
        cursor.execute(sql)
    cursor.close()
    conn.close()
   
   

输出结果:

分析 

后者创建primary key的方法按照gpt的想法是:

在 MySQL 中,主键(PRIMARY KEY)字段不能有默认值为 NULL。这是因为主键的设计目标是唯一标识每一行记录,而允许主键值为 NULL 是违反这一设计逻辑的。

按照 MySQL 的规范:

  • 主键字段必须是 非空(NOT NULL 的

 但事实上代码一方法可以使得primary key的default null,答案应当如下面的AI回答:即是由show columns造成的。

感谢您提供图片!从输出内容可以看出:

  • 主键列 Cno 和 Tno 的 Default 显示为 NULL
  • 但是 Null 属性为 NO,表明这些列是非空的(NOT NULL)。
  • Key 列显示了它们作为 PRIMARY KEY 的角色。

这的确看起来与 MySQL 的主键默认行为相冲突,因为按 MySQL 的规范,主键字段的默认值不能为 NULL


现象背后的原因

实际上,这里的 Default 列显示为 NULL 并不意味着主键字段的实际默认值是 NULL,而是 MySQL 的客户端工具或 SHOW COLUMNS 命令的显示习惯 导致的,具体解释如下:

1. Default 显示为空

在 MySQL 中,当字段没有明确指定默认值时,SHOW COLUMNS 或其他类似命令会展示 Default 列为 NULL。然而,这并不表示字段的默认值为 NULL。对于主键字段,MySQL 强制其为 NOT NULL,且不允许默认值为 NULL

2. 主键字段的隐式行为

无论是否显式声明 NOT NULL,MySQL 都会自动将主键字段设置为非空(NOT NULL)。这是主键约束的核心特性。

3. 为什么 Default 列显示了 NULL

这里的 NULL 并不表示字段的默认值可以为 NULL,而是表示该字段没有用户显式定义的默认值。

问题来源

educoder的实训

第1关:数据库表创建※ 

标签:__,默认值,DEFAULT,PRIMARY,CHAR,KEY,MySQL,NULL,主键
From: https://blog.csdn.net/a2848024156/article/details/144776366

相关文章

  • Eclipse Jgit 不支持高版本 openssh 私钥的结局方法 (jsch 报错 invalid privatekey
    替换jsch依赖<dependency><groupId>org.eclipse.jgit</groupId><artifactId>org.eclipse.jgit.ssh.jsch</artifactId><version>7.1.0.202411261347-r</version><ex......
  • TMS WEB Core Crack,Key Features of TMS WEB Core
    TMSWEBCoreCrack,KeyFeaturesofTMSWEBCoreTMSWEBCoreisconsideredidealforproducingmodernwebsoftwareforusersanddevelopers.DiscoveringtheunlimitedpossibilitiesoftheapplicationsalongwithdevelopmentwiththeuseoftheTMS......
  • Flutter OHOS flutter_keychain(字符串安全存储)
    flutter_keychain一个支持通过Keychain和Keystore支持字符串安全存储的Flutter插件如果您有其他类型想要存储,则需要序列化为UTF-8字符串。使用import'package:flutter_keychain/flutter_keychain.dart';...//Getvaluevarvalue=awaitFlutterKeychain.get(ke......
  • 【异常】‘.\keytool.exe‘ 不是内部或外部命令,也不是可运行的程序
    一、报错内容二、报错说明遇到'.\keytool.exe'不是内部或外部命令,也不是可运行的程序这个错误,通常是因为系统找不到keytool.exe的位置。keytool.exe是JavaDevelopmentKit(JDK)中的一个工具,用于管理密钥库(keystore)和证书。三、问题解决要解决这个问题,你需要......
  • html5中的meta标签keywords有什么作用?
    在HTML5中,<meta>标签的keywords属性曾经被用来为网页提供关键词,以便搜索引擎能够更好地理解和索引网页内容。然而,这个属性的实际作用在近年来已经大大减弱。过去,搜索引擎会依赖keywords属性来了解网页的主题和内容。网站开发者会在keywords属性中填入一系列与网页内容相关的关键......
  • NSSCTF--Crypto--[CISCN 2023 初赛]badkey
    [CISCN2023初赛]badkeytask:fromCrypto.Util.numberimport*fromCrypto.PublicKeyimportRSAfromhashlibimportsha256importrandom,os,signal,stringdefproof_of_work():random.seed(os.urandom(8))proof=''.join([random.choice(st......
  • Keys
    题目链接题意:求所有符合题目要求的真假钥匙的总数题解:先看数据范围N<=15,M<=100,数据不大,直接暴力枚举2^N种情况,然后对每组测试进行核验,当每组测试都通过时,这组数据符合要求。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=......
  • Redis大Key问题全解析
    1.引言1.1什么是Redis大Key?Redis大Key是指单个Key对应的数据量过大,占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种:String类型:单个字符串的长度过大。List类型:包含大量元素的列表。Hash类型:存储大量字段的哈希表。Set或ZSet类型......
  • 《LLM入门教程》大模型教程笔记1:环境配置(安装Anaconda、获取配置并测试OpenAI API key
    项目地址:llm-cookbook教程在线阅读:面向开发者的LLM入门教程文章目录环境配置一、安装Anaconda二、安装本书需要用到的python库三、获取并配置OpenAIAPIkey示例目录结构.envconfig.py运行结果解释`find_dotenv()`的查找机制示例说明配置`find_dotenv()`的参数`loa......
  • 在VS2022中,“根据模型生成数据库”时报错:已添加了具有相同键的项(或:An item with the s
      解决方法:关闭解决方案,打开解决方案所在文件夹,打开以下文件夹:.vs\ConsoleApp7\FileContentIndex,然后删除里面的所有文件,再重新在VS中打开解决方案重新生成即可 ......