今天做了下數據庫作業,好多出錯,記錄下,查漏補缺
本次只是實現一個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])