[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Postgre vs MySQL: типы данных
sergeiss
Продолжение темы: http://phpforum.su/index.php?showtopic=83964&hl=

А теперь поговорим о типах данных. Очень важный момент.

В Мускуле их достаточно немного: числовые, дата/время, символьные. Более подробно можно посмотреть, например, здесь вот http://phpclub.ru/mysql/doc/column-types.html

В Постгре типов данных очень много, я их не буду тут перечислять. Просто дам ссылку: http://postgresql.ru.net/manual/datatype.html

Хочу обратить внимание, что в Постгре мало того, что есть великое множество встроенных типов данных. Так там еще и свои типы данных можно создавать! http://postgresql.ru.net/manual/sql-createtype.html Пользовательские типы данных, после их создания, можно использовать везде: в функциях, запросах, триггерах...


Ставим Постгре "плюс" за это? wink.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
sergeiss
Зачем нужны некоторые типы...

Например, serial. Позволяет создать автоинкрементное поле. При этом автоматически создается автоинкремент (см. ниже).

create table goods2
(
id serial,
name_goods varchar(50)
)

Если запустим эту команду через pgAdmin, то он нам сообщит
Цитата
NOTICE:  CREATE TABLE will create implicit sequence "goods2_id_seq" for serial column "goods2.id"


В БД будет сделано следующее:
1. Автоматически будет создана последовательность
CREATE SEQUENCE goods2_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

Мы можем читать и изменять эти данные, управляя этим автоинкрементом.

2. Если мы посмотрим на структуру таблицы (в pgAdmin), то она такая стала:
CREATE TABLE goods2
(
id serial NOT NULL,
name_goods character varying(50)
)

То есть, Постгрес за нас дописал то, что нужно. И дальше мы просто работаем с полем id, это обычное автоинкрементное поле.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
S.Chushkin
SERIAL в mySQL есть.

Я не считаю способность создавать свои типы зачётным плюсом.
В mySQL достаточно типов данных для 99.9% потребностей. Пожалуй не хватает только двух типов - JSON и HTML для прозрачной поддержки полнотекстового индексирования.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
sergeiss
Цитата (S.Chushkin @ 11.11.2014 - 17:21)
Я не считаю способность создавать свои типы зачётным плюсом.
В mySQL достаточно типов данных для 99.9% потребностей.

Может быть. Но когда тебе вдруг понадобится чуть более сложный тип, чем стандартные для Мускуля, то ты будешь очень недоволен :) Или просто не будешь знать, что в Постгре такая же задача решается легко и просто. И не обязательно даже создавать свои типы данных, достаточно использовать уже имеющиеся.

Хорошо. Давай приведу такой пример. Например, у тебя есть таблица такого типа:
CREATE TABLE goods_types
(
id serial NOT NULL,
type1 integer,
type2 integer,
type3 integer
)

Допустим, есть такие данные:
Цитата

id type1 type2 type3
1  1       1       1
2  1       1       2
3  1       2       1
4  1       2       2
5  2       1       1
6  2       1       2
7  2       2       1
8  2       2       2

Задача: выбрать те строки, в которых одновременно (type1=1 и type2=2) или (type1=2 и type2=1)

Можно написать, конечно,
select * from goods_types
where (type1=1 and type2=1) or (type1=2 and type2=1)

И это будет правильно.

Но в Постгре можно написать
select * from goods_types
where row( type1, type2) in ( (1,1), (2,1) )

тут используется тип данных "row".

В данном примере мы получаем просто более "красивый" и понятный запрос, но в ряде случаев такая возможность может оказаться существенно более полезной. Например, если вместо перечня данных используется подзапрос:
select * from goods_types
where row( type1, type2) in ( select type1, type2 from any_other_table where <какое-то-условие> )

В Мускуле такое возможно? Поясняю: подзапрос возвращает строки, в каждой из которых содержится 2 величины. Их надо сравнить с парой заданных значений.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.