數據庫MySql python讀取插入數據,insert對那些類型加單引號,表單自己參考自己(外鍵),空值和NULL

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章