问题展示
代码一:
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