計算機科学のブログ

ほしい物リスト

SQL - SQLite - 賢いテーブル設計 - 正規化の理由 - 主キー、自動インクリメント

Head First SQL ―頭とからだで覚えるSQLの基本Lynn Beighley(著)、 佐藤 直生(監訳)、 松永 多苗子(翻訳)、 オライリージャパンの 4章(賢いテーブル設計 - 正規化の理由)、p.189(エクササイズ)の解答を求めてみる。

コード

sample3.py

#! /usr/bin/env python3

import sqlite3

con = sqlite3.connect('temp.db')
cur = con.cursor()

sql = """
create table your_table(
  id integer primary key autoincrement,
  first_name text,
  last_name text
)
"""

cur.execute(sql)
con.commit()

cur.execute('pragma table_info(your_table)')
for row in cur.fetchall():
    print(row)

sqls = [
    ## 成功
    """
insert into your_table (id, first_name, last_name)
values(null, 'マルシア', 'プレイディ')
""",
    # 失敗
    """
insert into your_table (id, first_name, last_name)
values (1, 'ジャン', 'プレイディ')
""",
    # 成功
    """
insert into your_table
values (2, 'ボビー', 'プレイディ')
""",
    # 成功
    """
insert into your_table (first_name, last_name)
values ('シンディ', 'プレイディ')
""",
    # 成功
    """
insert into your_table (id, first_name, last_name)
values (99, 'ピーター', 'プレイディ')
""",
]
for sql in sqls:
    print(sql.strip())
    try:
        cur.execute(sql)
        con.commit()
    except Exception as err:
        print(err)
        print('失敗')
    else:
        print('成功')

cur.execute('select * from your_table')
for row in cur.fetchall():
    print(row)

cur.close()
con.close()

入出力結果(Terminal, Zsh)

% ./sample3.py 
(0, 'id', 'INTEGER', 0, None, 1)
(1, 'first_name', 'TEXT', 0, None, 0)
(2, 'last_name', 'TEXT', 0, None, 0)
insert into your_table (id, first_name, last_name)
values(null, 'マルシア', 'プレイディ')
成功
insert into your_table (id, first_name, last_name)
values (1, 'ジャン', 'プレイディ')
UNIQUE constraint failed: your_table.id
失敗
insert into your_table
values (2, 'ボビー', 'プレイディ')
成功
insert into your_table (first_name, last_name)
values ('シンディ', 'プレイディ')
成功
insert into your_table (id, first_name, last_name)
values (99, 'ピーター', 'プレイディ')
成功
(1, 'マルシア', 'プレイディ')
(2, 'ボビー', 'プレイディ')
(3, 'シンディ', 'プレイディ')
(99, 'ピーター', 'プレイディ')
%