powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CREATE TABLE
11 сообщений из 11, страница 1 из 1
CREATE TABLE
    #38967302
Код на питоне, вопросы в комментариях к коду:

Код: 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
CREATE TABLE
    #38967328
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Академик Кадыров
Код: python
1.
id INTEGER PRIMARY KEY, -- нужен ли тут AUTOINCREMENT? NOT NULL?


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

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

При том, методом тыка замечено, если поле host заполнить, а поле port оставить нуловым, то констрейнт не срабатывает. Почему происходи так.... не знаю, может, White Owl подскажет)
...
Рейтинг: 0 / 0
CREATE TABLE
    #38967392
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу без 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
CREATE TABLE
    #38967394
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Академик Кадыров,

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

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

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

Я вас удовлетворил?
...
Рейтинг: 0 / 0
CREATE TABLE
    #38970290
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
CREATE TABLE
    #38970460
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Академик Кадыров,

индекс по version...
а сколько ~ записей в таблице?
какие значения будут попадать в это поле и какая будет выборка?
...
Рейтинг: 0 / 0
CREATE TABLE
    #38971364
PPA, ну соксы есть только 4 и 5 версии, там будет только цифра 4 или 5, наверное индекс и не нужен
...
Рейтинг: 0 / 0
CREATE TABLE
    #38971649
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
11 сообщений из 11, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CREATE TABLE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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