카테고리 없음

[Sql] 혼공학습단 10기_6주차 미션

노 코딩 노 라이프 2023. 8. 20. 23:32

6주차 미션!!


1. 기본미션

p. 363 market_db의 고객 테이블(member)에 입력된 회원의 정보가 변경될 때 변경한 사용자, 시간, 변경 전의 데이터 등을 기록하는 트리거 작성하고 인증하기

실행코드

USE market_db;
CREATE TABLE IF NOT EXISTS trigger_table (id INT, txt VARCHAR(10));
INSERT INTO trigger_table VALUES(1, '레드벨벳');
INSERT INTO trigger_table VALUES(2, '잇지');
INSERT INTO trigger_table VALUES(3, '블랙핑크');

DROP TRIGGER IF EXISTS myTrigger;
DELIMITER $$ 
CREATE TRIGGER myTrigger  -- 트리거 이름
    AFTER  DELETE -- 삭제후에 작동하도록 지정
    ON trigger_table -- 트리거를 부착할 테이블
    FOR EACH ROW -- 각 행마다 적용시킴
BEGIN
    SET @msg = '가수 그룹이 삭제됨' ; -- 트리거 실행시 작동되는 코드들
END $$ 
DELIMITER ;

SET @msg = '';
INSERT INTO trigger_table VALUES(4, '마마무');
SELECT @msg;
UPDATE trigger_table SET txt = '블핑' WHERE id = 3;
SELECT @msg;

DELETE FROM trigger_table WHERE id = 4;
SELECT @msg;

USE market_db;
CREATE TABLE singer (SELECT mem_id, mem_name, mem_number, addr FROM member);

DROP TABLE IF EXISTS backup_singer;
CREATE TABLE backup_singer
( mem_id  		CHAR(8) NOT NULL , 
  mem_name    	VARCHAR(10) NOT NULL, 
  mem_number    INT NOT NULL, 
  addr	  		CHAR(2) NOT NULL,
  modType  CHAR(2), -- 변경된 타입. '수정' 또는 '삭제'
  modDate  DATE, -- 변경된 날짜
  modUser  VARCHAR(30) -- 변경한 사용자
);

DROP TRIGGER IF EXISTS singer_updateTrg;
DELIMITER $$
CREATE TRIGGER singer_updateTrg  -- 트리거 이름
    AFTER UPDATE -- 변경 후에 작동하도록 지정
    ON singer -- 트리거를 부착할 테이블
    FOR EACH ROW 
BEGIN
    INSERT INTO backup_singer VALUES( OLD.mem_id, OLD.mem_name, OLD.mem_number, 
        OLD.addr, '수정', CURDATE(), CURRENT_USER() );
END $$ 
DELIMITER ;

DROP TRIGGER IF EXISTS singer_deleteTrg;
DELIMITER $$
CREATE TRIGGER singer_deleteTrg  -- 트리거 이름
    AFTER DELETE -- 삭제 후에 작동하도록 지정
    ON singer -- 트리거를 부착할 테이블
    FOR EACH ROW 
BEGIN
    INSERT INTO backup_singer VALUES( OLD.mem_id, OLD.mem_name, OLD.mem_number, 
        OLD.addr, '삭제', CURDATE(), CURRENT_USER() );
END $$ 
DELIMITER ;


UPDATE singer SET addr = '영국' WHERE mem_id = 'BLK';
DELETE FROM singer WHERE mem_number >= 7;

SELECT * FROM backup_singer;

TRUNCATE TABLE singer;

SELECT * FROM backup_singer;

결과


2. 선택미션

p. 402 GUI 응용 프로그램 만들고 인증하기

실행코드

from tkinter import *
import pymysql as pm
from tkinter import messagebox


def insertData():
    conn, cur = None, None
    userId, userName, userEmail, userBirthYear = "", "", "", ""
    sql = ""

    conn = pm.connect(host='127.0.0.1', user='root', password='0123456789**', db='soloDB', charset='utf8')
    cur = conn.cursor()

    userId = inputId.get()
    userName = inputName.get()
    userEmail = inputEmail.get()
    userBirthYear = inputBirthYear.get()
    sql = "insert into userTable values('" + userId + "','" + userName + "','" + userEmail + "','" + userBirthYear + "')"
    cur.execute(sql)

    conn.commit()
    conn.close()

    messagebox.showinfo('성공', '데이터 입력 성공')


def selectData():
    userId, userName, userEmail, userBirthYear = [], [], [], []

    conn = pm.connect(host='127.0.0.1', user='root', password='1189', db='solodb', charset='utf8')
    cur = conn.cursor()
    cur.execute("select * from userTable")

    userId.append("사용자 ID")
    userId.append("----------")
    userName.append("사용자 이름")
    userName.append("----------")
    userEmail.append("사용자 이메일")
    userEmail.append("----------")
    userBirthYear.append("사용자 출생연도")
    userBirthYear.append("----------")

    while True:
        row = cur.fetchone()
        if row is None:
            break
        userId.append(row[0])
        userName.append(row[1])
        userEmail.append(row[2])
        userBirthYear.append(row[3])

    userIdList.delete(0, userIdList.size() - 1)
    userNameList.delete(0, userNameList.size() - 1)
    userEmailList.delete(0, userEmailList.size() - 1)
    userBirthYearList.delete(0, userBirthYearList.size() - 1)

    for i1, i2, i3, i4 in zip(userId, userName, userEmail, userBirthYear) :
        userIdList.insert(END, i1)
        userNameList.insert(END, i2)
        userEmailList.insert(END, i3)
        userBirthYearList.insert(END, i4)

    conn.close()


root = Tk()

root.title("mysql 데이터 연동 프로그램")
root.geometry("600x300")

edtFrame = Frame(root)
edtFrame.pack()
listFrame = Frame(root)
listFrame.pack(side=BOTTOM, fill=BOTH, expand=1)

inputId = Entry(edtFrame, width=10)
inputId.pack(side=LEFT, padx=10, pady=10)
inputName = Entry(edtFrame, width=10)
inputName.pack(side=LEFT, padx=10, pady=10)
inputEmail = Entry(edtFrame, width=10)
inputEmail.pack(side=LEFT, padx=10, pady=10)
inputBirthYear = Entry(edtFrame, width=10)
inputBirthYear.pack(side=LEFT, padx=10, pady=10)

btnInsert = Button(edtFrame, text="입력", command=insertData)
btnInsert.pack(side=LEFT, padx=10, pady=10)
btnSelect = Button(edtFrame, text="조회", command=selectData)
btnSelect.pack(side=LEFT, padx=10, pady=10)

userIdList = Listbox(listFrame, bg='yellow')
userNameList = Listbox(listFrame, bg='yellow')
userEmailList = Listbox(listFrame, bg='yellow')
userBirthYearList = Listbox(listFrame, bg='yellow')
userIdList.pack(side=LEFT, fill=BOTH, expand=1)
userNameList.pack(side=LEFT, fill=BOTH, expand=1)
userEmailList.pack(side=LEFT, fill=BOTH, expand=1)
userBirthYearList.pack(side=LEFT, fill=BOTH, expand=1)

root.mainloop()

결과

 

3. 필기

[Sql] Chapter 07. 스토어드 프로시저 — 노 코딩 노 라이프 (tistory.com)

 

[Sql] Chapter 07. 스토어드 프로시저

7장 : 스토어드 프로시저 07-1 스토어드 포로시저 사용 방법 1. 스토어드 프로시저 기본 스토어드 프로시저는 데이터베이스에 저장되어 실행 가능한 미리 작성된 SQL 문의 집합입니다. 이를 사용하

rei050r.tistory.com