今天做了下数据库作业,好多出错,记录下,查漏补缺
本次只是实现一个employee表单,特殊在有一个外键参考自身主键,并且老师给的数据该外键可为null
表结构直接用workbench 里面构造的,Navicat还没解决不修改密码策略的条件下连接mysql8.
外键约束
然后根据给的数据,插入数据
先尝试直接在WORKbench里面用SQL语句插入
insert into employee (Fname,Minit,Lname,Ssn,Bdate,Address,Sex,Salary,Super_ssn,Dno)
values('Franklin','T','Wong',333945555,STR_TO_DATE('08-DEC-1945', '%d-%b-%Y'),'638Voss,Houston,TX','M',null,adsdda,5);
我之前理解的插入数据加不加单引号的规则是:
- 字符串类型的varchar,char,nvarchar,nchar,text,ntext,日期类型datetime都需要加单引号
- int,numeric,bit等数值型,逻辑型的不用加引号
但上面Super_ssn是VCARCHAR(9)类型,并且全是数字,可以不用加单引号,数据库学的太差了。。。。。。。
然后是关于Super_ssn的null值问题,因为他是外键并且参考自身的主键,还有NULL的存在,所以很特殊。
我们想要某一记录的Super_ssn是默认的空值,可以直接忽略该列,也可以像上面一样 直接是null 或者NULL 记住没有单引号,加上单引号可就是四个char值分别是N U L L 了。
然后我们如果想要查询Super_ssn是null值的时候,应该用is null 而不是=null …具体为啥我也有点懵。。。。实践了就是这样
import pymysql
import random
def insert(Fname,Minit,Lname,Ssn,Bdate,Address,Sex,Salary,Super_ssn,Dno):
conn = pymysql.connect(host='127.0.0.1' # 连接名称,默认127.0.0.1
, user='root' # 用户名
, passwd='root' # 密码
, port=3306 # 端口,默认为3306
, db='get' # 数据库名称
, charset='utf8' # 字符编码
)
cur = conn.cursor() # 生成游标对象
sql = "insert into employee (Fname,Minit,Lname,Ssn,Bdate,Address,Sex,Salary,Super_ssn,Dno) " + \
"values('" + Fname + "','" + Minit + "','" + Lname + "','" + Ssn + \
"'," + "STR_TO_DATE('" + Bdate + "', '%d-%b-%Y')" + ",'"+ Address + "','"+ Sex +\
"'," + Salary + "," + Super_ssn + ",'"+ Dno+"');"
print(sql)
cur.execute(sql) # 执行SQL语句
conn.commit() # 提交到数据库执行
data = cur.fetchall() # 通过fetchall方法获得数据
print(data)
cur.close() # 关闭游标
conn.close() # 关闭连接
## https://www.bilibili.com/read/cv3418619/
with open("EMPLOYEE.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n') #去掉列表中每一个元素的换行符
attribute=line.split(',')
attribute[5]=attribute[5]+","+attribute[6]+","+attribute[7]
attribute.pop(6)
attribute.pop(6)
length = len(attribute)
for elemnet,i in zip(attribute,range(length)):
get = elemnet.replace('\'', '')
get = get.replace(' ', '')
if(get=="null"):
get="NULL"
attribute[i]=get
print(attribute)
insert(attribute[0],attribute[1],attribute[2],attribute[3],attribute[4],attribute[5],attribute[6],attribute[7],attribute[8],attribute[9])