Вверх ↑
Этот топик читают: Гость
Ответов: 1891
Рейтинг: 110
#16: 2007-04-04 23:31:40 ЛС | профиль | цитата
Tad, а попробуй два раза подряд выполнить DELETE FROM table WHERE rowid=1;
карма: 0
%time%
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#17: 2007-06-09 23:18:53 ЛС | профиль | цитата
Alexbootch, Tad, какой надо правильно написать запрос INSERT INTO table VALUES(...), чтобы первое поле, например: id c AUTOINCREMENT'ом, автоматически увеличилось на один, если я изначально не знаю его значения?

[size=-2]------ Добавлено в 23:18
Мне еще интересна концепция работы с базой из двух различных приложений (одно приложение открывает суточную базу и постоянное туда чего-то пишет, а второе, по мере надобности, обращается к этой суточной базе и считывает отобранные данные). Как это концептуально правильно оформить?
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#18: 2007-06-09 23:51:30 ЛС | профиль | цитата
INSERT INTO table VALUES(null, , , )

[size=-2]------ Добавлено в 23:51
( для AUTOINCREMENT в первой колонке.)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#19: 2007-06-09 23:55:27 ЛС | профиль | цитата
Tad, ага, понял, спасибо. А по второму вопросу что-либо сказать можешь? Я еще не силен в базах, вот и спрашиваю, но мне надо обязательно научиться с ними работать.

[size=-2]------ Добавлено в 23:55
Tad писал(а):
для AUTOINCREMENT в первой колонке

Я понял так, что null для поля с AUTOINCREMENT'ом означает приращение на один.
карма: 22

0
Ответов: 1891
Рейтинг: 110
#20: 2007-06-10 03:01:49 ЛС | профиль | цитата
nesco, писал(а):
Alexbootch, Tad, какой надо правильно написать запрос INSERT INTO table VALUES(...), чтобы первое поле, например: id c AUTOINCREMENT'ом, автоматически увеличилось на один, если я изначально не знаю его значения?


nesco, если таблица к примеру такая:

CREATE TABLE SPISOK (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,OPIS VARCHAR(50) NULL, COMMENT TEXT NULL);



И первый столбец в таблице имеет значение PRIMARY KEY AUTOINCREMENT, то при вставке данных в таблицу его (значение первого столбца записи, которую необходимо вставить) можно опускать, т.к. оно автоматом увеличивается, например, так:

INSERT INTO SPISOK ('OPIS','COMMENT') VALUES ('Это описание','Это комментарий')



nesco, писал(а):
Я понял так, что null для поля с AUTOINCREMENT'ом означает приращение на один


null он и в Африке null. Так нельзя писать

Если поле в таблице имеет значение PRIMARY KEY AUTOINCREMENT - оно не может быть равно null, т.к. первичные ключи не могут позволять значений NULL. Это означает что, подобно полям в ограничении UNIQUE, любое поле, используемое в ограничении PRIMARY KEY, должно уже быть объявлено NOT NULL.


nesco, писал(а):
Мне еще интересна концепция работы с базой из двух различных приложений (одно приложение открывает суточную базу и постоянное туда чего-то пишет, а второе, по мере надобности, обращается к этой суточной базе и считывает отобранные данные). Как это концептуально правильно оформить?


Здесь нет ничего сложного, только необходимо сделать так, что бы непосредственно при записи данных в таблицу другая программа не выполняла какие-либо транзакции с базой данных иначе данные могут не записаться. Более подробно для базы данных SQLite можно почитать здесь
карма: 0
%time%
0
Ответов: 16884
Рейтинг: 1239
#21: 2007-06-10 10:20:09 ЛС | профиль | цитата
Alexbootch писал(а):
ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
это означает "масло маслянное" и просто не даст тебе начать заполнение таблицы с ID=0
nesco писал(а):
Я понял так, что null для поля с AUTOINCREMENT'ом означает приращение на один.
правильно понял (при таком формате команды "INSERT INTO table VALUES(null, , , )" )

[size=-2]------ Добавлено в 10:20
So why, with the decision that data typing was a bad idea, has SQLite implemented one column type that's different? The reason for an INTEGER PRIMARY KEY is to allow for the equivalent of an AUTOINCREMENT or IDENTITY column.

You can insert any 32-bit signed integer value into an INTEGER PRIMARY KEY column, or insert a NULL to tell SQLite to assign the value itself. Inserting a NULL will cause a value of one greater than the largest value already stored in that column to be used.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#22: 2007-06-10 10:59:42 ЛС | профиль | цитата
Alexbootch писал(а):
Здесь нет ничего сложного, только необходимо сделать так, что бы непосредственно при записи данных в таблицу другая программа не выполняла какие-либо транзакции с базой

Под транзакциями понимается тело цикла модификации, при успешном окончании которого, модификация считается успешно завершенной, иначе база не меняется вообще, я правильно понял? Значит приложение, записывающее в базу должно начинать цикл модификации с запроса BEGIN TRANSACTION, или это не обязательно, при условии, что другое приложение открывает базу только на просмотр и поиск (или уже ищет в базе до 100 000 тысяч записей). И чем операторные скобки BEGIN TRANSACTION должны заканчиваться -- END, COMMIT или ROLLBACK [TRANSACTION]?
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#23: 2007-06-10 11:12:58 ЛС | профиль | цитата
И вдогонку.
Если создать таблицу:
CREATE TABLE tst( id integer primary key, name)
то по команде
INSERT INTO TST VALUES(100, "BVZ")
запишется первая строка с id=100, а следующая команда
INSERT INTO TST VALUES(null, "BVZ") запишет вторую строку с id=101
NULL он и в Африке null, но в SQLite не всегда
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#24: 2007-06-10 11:22:08 ЛС | профиль | цитата
Tad писал(а):
NULL он и в Африке null, но в SQLite не всегда

Null, в данном случае, комманда на инкремент, а не значение, я это уже понял.
А то что ты написал -- точно? Потому, что в некоторых базах я видел другой случай -- пишешь принудительно номер 100, он записывается как 100, но если просто создаешь запись, то создается с номером 1, и так до 100, затем 100 перескакивает и создается 101. Разве AUTOINCREMENT считается не от минимального значения7
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#25: 2007-06-10 12:43:24 ЛС | профиль | цитата
Tad писал(а):
CREATE TABLE tst( id integer primary key, name)

и где ты увидел AUTOINCREMENT ?
nesco писал(а):
А то что ты написал -- точно?

точно

[size=-2]------ Добавлено в 12:43
ДА и при использовании AUTOINCREMENT тоже . Только-что проверил. А Вам лень
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#26: 2007-06-10 12:44:09 ЛС | профиль | цитата
Tad, тогда непонятно. Если нет AUTOINCREMENT'a, то какого черта по null значение увеличивается на один, в таком случае ничего делаться не должно? Нет, не понятно и не логично как-то.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#27: 2007-06-10 12:53:54 ЛС | профиль | цитата
Так устоена SQLite. Я, если что-то советую, то сначала проверяю. Так что вопросы типа "Точно ?" можно не задавать. При проверке понял почему у тебя (или у Alexbootch) команда типа "name AS Имя" добавляла колонку - в свойствах StringTable ClearAll = False.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#28: 2007-06-10 13:52:40 ЛС | профиль | цитата
Tad писал(а):
ClearAll = False

Все правильно, так и должно быть -- нет полного обнуления колонок, а значит -- будет добавляться.

[size=-2]------ Добавлено в 13:52
Еще вопрос. Я удвляю запись. Делаю запрос VACUUM. Будут ли в этом случае перенумерованы строки в поле PRIMERY KEY AUTOINCREMENT?
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#29: 2007-06-10 14:09:01 ЛС | профиль | цитата
нет. Номера останутся старые. Если были 1,2,3.4 то удалив 3 получишь 1,2,4 , в вот rowid изменятся на 1,2,3
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26109
Рейтинг: 2124
#30: 2007-06-10 17:45:35 ЛС | профиль | цитата
Вот еще непонятный момент. Даю запрос
DELETE FROM _%1;
DROP TABLE _%1;
А оно мне в ответ -- database table is locked. Как это победить? Мне нужно при удалении записи в главной таблице (в одном из полей хранится имя сопутствующей таблицы) полностью удалять сопутствующую таблицу. Я думаю понятно, что %1 это имя сопутствующей таблицы, взятое из одного из полей главной таблицы.

[size=-2]------ Добавлено в 16:08
Ха! Прикол. Таблица удаляется, но сообщение выдается, а ведь не должно.

[size=-2]------ Добавлено в 16:21
Tad писал(а):
Если были 1,2,3.4 то удалив 3 получишь 1,2,4 , в вот rowid изменятся на 1,2,3

А вот нифига не получается. Удаляю 3, даю VACUUM. В id -- 1,2,4, обращение веду по rowid, оно должно быть 1,2,3, а оно на номере 3 ничего не читает. похоже id и rowid -- это одно и то же. Теперь что, надо все поле id переписывать, или есть запрос на перенумерацию поля id?

[size=-2]------ Добавлено в 17:45
Что такое rowid и _rowid_, в чем их отличие. Ничерта не могу понять с абсолютной нумерацией строк в таблице.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)