Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы) |
22.3.2009, 0:47
Сообщение
#61
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
т.е. получается есть таблицы
id....NIKC 1.....ник1 2.....ник2 id....IP 1.....ип1 2.....ип2 а третья будет вида id.......id_NICK......id_IP 1.......id_ник1......id_ип1 2.......id_ник1......id_ип2 так? |
|
|
22.3.2009, 0:55
Сообщение
#62
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
возможно, что будет так:
id....NIKC 1.....ник1 2.....ник2 id....IP 1.....ип1 2.....ип2 а третья будет вида id.......id_NICK......id_IP 1.......id_ник1......id_ип1 2.......id_ник1......id_ип2 3.......id_ник2......id_ип1 4.......id_ник2......id_ип2 при этом пара полей id_NICK и id_IP вместе являются уникальными |
|
|
22.3.2009, 3:28
Сообщение
#63
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
А можно и вовсе одну таблицу создать. С первичным ключом по двум столбцам - IP и ник.
|
|
|
22.3.2009, 3:33
Сообщение
#64
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ну это смотря какие задачи)))
У меня в мульти-скрипте этого сделать невозможно))) Простым программистам, в отличии от программистов баз данных, всегда хочется всё запихнуть в одну таблицу, при этом база данных становится не такой гибкой. Кроме этого, следует по возможности производить нормализацию базы данных и приведение её к нормальной форме Бойса-Кодда. Теория проектирования баз данных описывает алгоритмы правильного построения бд, другое дело, что не всегда получается им следовать, однако надо стараться это делать для того, чтобы получить наиболее эффективную базу данных, без избыточности и всяческий аномалий. |
|
|
25.3.2009, 20:25
Сообщение
#65
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Блин я как всегда туплю!
Код assert(con:execute[[ CREATE TABLE IF NOT EXISTS `Nicks`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `Nick` VARCHAR(64) NOT NULL, PRIMARY KEY(`id`), UNIQUE(`Nick`) ) CREATE TABLE IF NOT EXISTS `IPs`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `IP` VARCHAR(64) NOT NULL, PRIMARY KEY(`id`), UNIQUE(`IP`) ) ]]) ругается на синтаксис. чем разделить два запроса? |
|
|
25.3.2009, 20:56
Сообщение
#66
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Библиотека не предполагает выполнение двух запросов в одной транзакции. Для выполнения второго запроса должна быть закрыта первая транзакция.
|
|
|
25.3.2009, 21:59
Сообщение
#67
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
блин да что ж такое. когда берусь за своего бота ничего не пашет(((
Код function OnStartup() assert(con:execute[[CREATE TABLE IF NOT EXISTS `Nicks`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Nick` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), UNIQUE(`Nick`))]]) assert(con:execute[[CREATE TABLE IF NOT EXISTS `IPs`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`IP` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), UNIQUE(`IP`))]]) assert(con:execute[[CREATE TABLE IF NOT EXISTS `Users`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`id_Nick` MEDIUMINT(10) NOT NULL,`id_IP` MEDIUMINT(10) NOT NULL,PRIMARY KEY(`id`))]]) .... function UserConnected(tUser) local Share = Core.GetUserValue(tUser, 16) or 0 con:execute(("INSERT INTO `Nicks (`Nick`) VALUES ('%s')"):format(tUser.sNick)) con:execute(("INSERT INTO `IPs (`IP`) VALUES ('%s')"):format(tUser.sIP)) не добавляет в базу и всё тут! |
|
|
25.3.2009, 22:02
Сообщение
#68
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Невнимательность просто
con:execute(("INSERT INTO `Nicks` (`Nick`) VALUES ('%s')"):format(tUser.sNick)) |
|
|
26.3.2009, 17:26
Сообщение
#69
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
есть код
Код con:execute(("INSERT INTO `Nicks` (`Nick`) VALUES ('%s')"):format(tUser.sNick)) con:execute(("INSERT INTO `IPs` (`IP`) VALUES ('%s')"):format(tUser.sIP)) con:execute(("INSERT INTO `Users` (`id_Nick`,`id_IP`) VALUES ((SELECT `id` FROM `Nicks` WHERE Nick = '%s'), (SELECT `id` FROM `IPs` WHERE IP = '%s'))"):format(tUser.sNick,tUser.sIP)) можно ли сделать проверку перед заносом данных в таблицу Users языком MySQL или это уже скриптом? |
|
|
26.3.2009, 17:44
Сообщение
#70
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
База данных должна быть организована таким образом, чтобы все лишние проверки исключались. То есть нужно соблюдать целостность базы данных. Целостность базы данных заключается в объявлении уникальных атрибутов. База данных сама проверяет уникальные атрибуты, и если вносятся данные с уже существующим в таблице уникальным атрибутом, то база игнорирует внесение в таблицу таких данных.
Уникальность атрибутов может осуществляться для каждого атрибута в отдельности, а может осуществляться для группы атрибутов. В рассматриваемой тобой таблице `Users`, по всей видимости, уникальность нужно придать группе атрибутов: `id_Nick` и `id_IP`, тогда при очередной вставке в эту таблицу будет проверяться существование двух указанных значений. |
|
|
26.3.2009, 21:34
Сообщение
#71
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
с этим быстро разобрался. теперь есть:
Код assert(con:execute[[CREATE TABLE IF NOT EXISTS `Nicks`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Nick` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), UNIQUE(`Nick`))]]) assert(con:execute[[CREATE TABLE IF NOT EXISTS `IPs`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`IP` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), UNIQUE(`IP`))]]) assert(con:execute[[CREATE TABLE IF NOT EXISTS `Users`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`id_Nick` MEDIUMINT(10) NOT NULL,`id_IP` MEDIUMINT(10) NOT NULL,PRIMARY KEY(`id`), UNIQUE(`id_Nick`,`id_IP`))]]) assert(con:execute[[CREATE TABLE IF NOT EXISTS `MainLog`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`DateTime` DATETIME NOT NULL, `id_User` MEDIUMINT(10) NOT NULL,`Msg` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`))]]) и Код if tCfg.MainLogs == 1 then local _,_,sData = string.find(sData, "%b<>%s+(.*)") con:execute(([[INSERT INTO `MainLog` (`DateTime`, `id_User`, `Msg`) VALUES ('%s', (SELECT `id` FROM `Users` WHERE (id_Nick = 'SELECT `id` FROM `Nicks` WHERE Nick = '%s'),(id_IP = 'SELECT `id` FROM `IPs` WHERE IP = '%s')), '%s')]]):format(os.date("%Y-%m-%d %H:%M:%S"),tUser.sNick, tUser.sIP, sData)) end в общем я хочу в таблицу лога главного чата записать ид юзера из таблицы Users. Получился громоздкий и неработающий код... Можно как то ужать? |
|
|
26.3.2009, 21:57
Сообщение
#72
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата NOT NULL,PRIMARY KEY(`id`), UNIQUE(`IP`) Т.е. и id и IP должны быть уникальными? Как-то не очень хорошо получается. А если зайдёт юзер с таким же IP? И вообще, использовать id для лога чата бессмысленно до тех пор, пока незарегистрированные юзеры могут отправлять сообщения. id имеет смысл использовать там, где он может стать уникальным идентификатором чего-либо. |
|
|
26.3.2009, 22:51
Сообщение
#73
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
смысл тут таков. есть таблица с никами(там ник уникальное поле) и такая же таблица с ип. после чего выделяем мнимого уникального юзера сводя их в таблицу Users. примерно так)))
так как всё это делается при входе юзера то он 100% зареген! поэтому нужно id и именно из таблицы Users |
|
|
26.3.2009, 23:18
Сообщение
#74
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Всё верно, но вот только ты не совсем понял суть введения 3 таблиц, так как в твоём представленном варианте можно было вместо этих 3 таблиц записать 1 таблицу. Какой смысл несёт введение 3 таблиц у тебя? Видимо ты просто повторил то, что я тебе сказал, но у меня всё по другому нежели у тебя, и смысл трёх таблиц заключается в идентификации аккаунта пользователя))))
|
|
|
26.3.2009, 23:52
Сообщение
#75
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
|
|
|
27.3.2009, 0:02
Сообщение
#76
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ты прав, избыточность данных уничтожается. С точки зрения нормализации всё верно, однако с точки зрения здравого смысла избыточность такого рода заменилась избыточностью, выраженной в совпадении идентификаторов. По своей сути в этих трёх таблицах должны присутствовать ещё и другие поля, иначе смысл замены одной избыточности другой не понятен.
Если в таблицах Nicks и Ips присутствует по одному не ключевому атрибуту, то дробление на таблицы приводит к аномалиям в базе данных. В таблицах Nicks и Ips обязательно должны присутствовать 2 или более не ключевых атрибутов, тогда дробление оправдано. |
|
|
27.3.2009, 17:46
Сообщение
#77
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Как получить id последней строки таблицы?
на вот это ругается по синтаксису: Код local iNumb = assert(con:execute("LAST_INSERT_ID(`TextSeach`)"))
--или local iNumb = assert(con:execute("mysql_insert_id(`TextSeach`)")) |
|
|
27.3.2009, 19:39
Сообщение
#78
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
А для чего тебе это понадобилось?
Код SELECT `id` FROM `table` ORDER BY `id` DESC LIMIT 1
|
|
|
27.3.2009, 19:40
Сообщение
#79
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
когда сделаю покажу. может ты подскажешь и другое решение)))
|
|
|
5.4.2009, 13:14
Сообщение
#80
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Код function SearchArrival(tUser, sData) sData = sData:sub(1,-2) local _,_,iNumber,sSeach = sData:find("$Search .-%s%u%p%u%p%d%p(%d+)%p(.*)") sSeach = String2Lower(sSeach) sSeach = sSeach:gsub("%p", " ") local _,_,sTthseach = sSeach:find("^(%a%a%a)") if sTthseach ~= "tth" then con:execute(("INSERT INTO `TextSeach` (`Seach`) VALUES ('%s')"):format(sSeach)) con:execute(("UPDATE `TextSeach` SET '%s' = '%s' + 1 WHERE `Seach` = '%s'"):format("S"..tostring(iNumber), "S"..tostring(iNumber), sSeach)) где тут ошибка? инсертит но не апдейтит((( создание таблицы: Код assert(con:execute[[CREATE TABLE IF NOT EXISTS `TextSeach`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Seach` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), `S1` MEDIUMINT(10) NOT NULL DEFAULT 0,
`S2` MEDIUMINT(10) NOT NULL DEFAULT 0, `S3` MEDIUMINT(10) NOT NULL DEFAULT 0, `S4` MEDIUMINT(10) NOT NULL DEFAULT 0, `S5` MEDIUMINT(10) NOT NULL DEFAULT 0, `S6` MEDIUMINT(10) NOT NULL DEFAULT 0, `S7` MEDIUMINT(10) NOT NULL DEFAULT 0, `S8` MEDIUMINT(10) NOT NULL DEFAULT 0, `S10` MEDIUMINT(10) NOT NULL DEFAULT 0, UNIQUE(`Seach`))]]) |
|
|
Похожие темы
|
Сейчас: 27.11.2024, 3:20 |