Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CREATE TABLE / 11 сообщений из 11, страница 1 из 1
24.05.2015, 17:43
    #38967302
CREATE TABLE
Код на питоне, вопросы в комментариях к коду:

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
import sqlite3

conn = sqlite3.connect('socks5.db') # , isolation_level=None) # для включения autocommit
cur = conn.cursor()

cur.execute("""CREATE TABLE IF NOT EXISTS socks5(
    id INTEGER PRIMARY KEY, -- нужен ли тут AUTOINCREMENT? NOT NULL?
    host TEXT, -- NOT NULL?
    port INTEGER,
    CONSTRAINT host_port UNIQUE(host, port)
); -- WITHOUT ROWID?""")

cur.execute("INSERT INTO socks5 VALUES(NULL, ?, ?);", ("127.0.0.1", 9050))

try:
    cur.execute("INSERT INTO socks5 VALUES(NULL, ?, ?);", ("127.0.0.1", 9050))
except sqlite3.IntegrityError as e: # UNIQUE constraint failed: socks5.host, socks5.port
    print(e)

cur.execute("INSERT INTO socks5 VALUES(NULL, ?, ?);", ("127.0.0.1", 9051))

#     with conn:
#         cur.execute(...)
# Аналог:
#     cur.execute(...)
#     conn.commit()

cur.execute("SELECT * FROM socks5;")
print(cur.fetchall())
cur.execute("DELETE FROM socks5;")
...
Рейтинг: 0 / 0
24.05.2015, 18:52
    #38967328
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
Академик Кадыров
Код: python
1.
id INTEGER PRIMARY KEY, -- нужен ли тут AUTOINCREMENT? NOT NULL?


NO NULL и AUTOINCREMENT не нужен, по крайней мере при вставки в таблицу, не указывая id (собственно или указывая поле с значением NULL), SQLite сам добавляет новый id (грубо Max(id)+1)
...
Рейтинг: 0 / 0
24.05.2015, 19:46
    #38967349
CREATE TABLE
VSVLAD, а для остальных полей NOT NULL нужен? Там тип указан, но NULL пройдет же
...
Рейтинг: 0 / 0
24.05.2015, 20:53
    #38967391
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
Академик Кадыров,

Здесь уже зависит от логики, которую вы вкладываете. Я бы поставил для всех полей not null, хуже не будет.

При том, методом тыка замечено, если поле host заполнить, а поле port оставить нуловым, то констрейнт не срабатывает. Почему происходи так.... не знаю, может, White Owl подскажет)
...
Рейтинг: 0 / 0
24.05.2015, 20:58
    #38967392
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
По поводу без RowID, вы читали официальный док ?

Там сказано:
The only advantage of a WITHOUT ROWID table is that it can sometimes use less disk space and/or perform a little faster than an ordinary rowid table.
Я думаю сэкономить несколько килобайт нет необходимости, при том ещё пишут, если правильно перевожу, что автоинкремент работать не будет:
AUTOINCREMENT does not work on WITHOUT ROWID tables . The AUTOINCREMENT mechanism assumes the presence of a rowid and so it does not work on a WITHOUT ROWID table.
...
Рейтинг: 0 / 0
24.05.2015, 21:03
    #38967394
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
Академик Кадыров,

Ещё тут читаю, немножко обманул Вас... AUTOINCREMENT нужно поставить, иначе если удалить, последний ID в таблице с данными, и добавить новую запись, то ID возьмётся (Max(ID) + 1), т.е. последний свободный, а не "следующий"... Сам же AUTOINCREMENT можно указать, чтобы предотвратить такое поведение (опять же если потребуется), но как пишут , что он накладывает дополнительные расходные операции на I/O
...
Рейтинг: 0 / 0
24.05.2015, 23:37
    #38967439
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
VSVLADАкадемик Кадыров,

Здесь уже зависит от логики, которую вы вкладываете. Я бы поставил для всех полей not null, хуже не будет.

При том, методом тыка замечено, если поле host заполнить, а поле port оставить нуловым, то констрейнт не срабатывает. Почему происходи так.... не знаю, может, White Owl подскажет)Читать букварь: http://www.sql.ru/docs/sql/u_sql/ch5.shtml#5.4
NULL это "неизвестно".
"неизвестно" сравниваемый с "неизвестно" - результат "неизвестно".
"неизвестно" не является "равно".
Ограничение на уникальность срабатывает только тогда, когда сравнение ограничивающих полей в двух строках дает "равно".

Я вас удовлетворил?
...
Рейтинг: 0 / 0
28.05.2015, 03:42
    #38970290
CREATE TABLE
White Owl,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS socks(
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    host TEXT NOT NULL,
    port INTEGER NOT NULL,
    version INTEGER NOT NULL,
    CONSTRAINT host_port UNIQUE(host, port)
);
CREATE INDEX IF NOT EXISTS index_version ON socks(version);



Я так сделал
...
Рейтинг: 0 / 0
28.05.2015, 11:04
    #38970460
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
Академик Кадыров,

индекс по version...
а сколько ~ записей в таблице?
какие значения будут попадать в это поле и какая будет выборка?
...
Рейтинг: 0 / 0
29.05.2015, 01:31
    #38971364
CREATE TABLE
PPA, ну соксы есть только 4 и 5 версии, там будет только цифра 4 или 5, наверное индекс и не нужен
...
Рейтинг: 0 / 0
29.05.2015, 11:32
    #38971649
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TABLE
VSVLAD The only advantage of a WITHOUT ROWID table is that it can sometimes use less disk space and/or perform a little faster than an ordinary rowid table.
Я думаю сэкономить несколько килобайт нет необходимости, , ч
на маленькой базе с полмиллионом строчек уже есть необходимость?
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CREATE TABLE / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]