0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
1 | |
PSQL, несколько различных заданий28.06.2016, 13:45. Показов 2170. Ответов 28
Метки нет (Все метки)
Добрый день!
Имеем две таблицы books(книги) и publishers(издательства) books содержит колонки book_name и publisher_id publishers содержит pub_name и и те же publisher_id Нужно отобразить список всех издательств (pub_name) и количество издаваемых ими книг(book_name). Как делать простую выборку понимаю, а с двумя и более таблицамии застрял =( Буду благодарен если сможете отписаться в личку, нужна помощь по PSQL до конца летнего семестра. Спасибо!
0
|
28.06.2016, 13:45 | |
Ответы с готовыми решениями:
28
Импорт БД psql SQL Shell (psql) Начало работы с PSQL Ошибка psql при закрытии периодов |
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
||||||
28.06.2016, 13:50 | 2 | |||||
связываете таблицы и делаете как обычно, как будто у вас одна большая таблица. для агрегатных функций используйте группировку
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
29.06.2016, 00:36 [ТС] | 3 |
Спасибо, все работает, добавил еще ORDER BY для отображение по имени в алфавитном порядке.
Добавлено через 1 час 56 минут Столкнулся со следующей проблемой. Нужно дописать к последней колонке в таблице author проверку, что я и сделал: Код
alter table author ADD CHECK(col4 >= 1900 and col4 <= 1930); Код
ERROR: check constraint "author_col4_check1" is violated by some row Код
Table "public.author" Column | Type | Modifiers ------------+---------+----------- col1 | numeric | not null col2 | text | not null col3 | text | not null col4 | numeric | not null
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|
29.06.2016, 02:43 | 4 |
Дословный перевод ошибки: проверочное ограничение "xxxxx" нарушается некоторой строкой.
это обозначает, что в таблице уже есть записи, у которых в col4 есть значения, выходящие за диапазон [1900; 1930]. удалите эти записи или измените указанные значения и все пойдет.
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
29.06.2016, 12:05 [ТС] | 5 |
Как удалить ограничение char(1)?
Ранее я установил ограничение для Middle Initial Код
ALTER TABLE doctor ADD COLUMN "Middle Initial" CHAR(1); Код
ALTER TABLE doctor DROP CONSTRAINT constraint_name_check;
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|
29.06.2016, 12:12 | 6 |
Сообщение было отмечено Ruson как решение
Решение
ALTER TABLE ... ADD COLUMN не устанавливает ограничение, а добавляет новую колонку в таблицу!!!
поэтому какой DROP CONSTRAINT вы хотите сделать?? для изменения типа колонки используйте конструкцию ALTER TABLE таблица ALTER COLUMN имя_колонки TYPE новый_тип_данных; помощь здесь
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
29.06.2016, 12:15 [ТС] | 7 |
Упс.. все верно, ошибочно скопировал не ту строчку. Добавлял ограние вот так:
Код
ALTER TABLE tablename_tbl ADD Check (char_length (Initial) = 1) ; Код
ALTER TABLE doctor drop COLUMN "Middle Initial"; ALTER TABLE doctor ADD COLUMN "Middle Initial" CHAR(2);
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|
29.06.2016, 12:21 | 8 |
Сообщение было отмечено Ruson как решение
Решение
Это не всегда удобно, так как удаляются данные, которые уже могут находиться в таблице. ALTER COLUMN пытается конвертировать и сохраняет существующие данные. Если сконвертировать не удается, будет ошибка.
Добавлено через 3 минуты Не помню на память... попробуйте банально ADD CHECK заменить на DROP CHECK, если не задавали явно имя ограничению. Либо посмотрите полное текущее описание таблицы, там база какое-нибудь имя должна была назначить.
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
29.06.2016, 15:27 [ТС] | 9 |
Ну и конечно-же я не мог не попробовать Ваш вариант который прекрасно сработал =)
Код
ALTER TABLE doctor ALTER COLUMN "Middle Initial" TYPE CHAR(2); Добавлено через 1 минуту DROP CHECK не работает, может я конечно что-то упустил, пробовал несколько раз, поэтому и задал вопрос тут =) Добавлено через 3 часа 3 минуты Как добавить проверку на возраст к существующей таблице? Например, есть колонка "age" в которую пользователь вводит дату дня рождения, если пользователю 17 лет или меньше то он не может заполнить анкету. Представляю использование функции current_date, от которой нужно отминусовать введенную дату и сравнить результат с условием > 17, но не до конца понимаю как это корректно сделать в psql .
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
||||||
29.06.2016, 16:36 | 10 | |||||
Сообщение было отмечено Ruson как решение
Решение
да тут вроде ничего не должно смущать.
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
29.06.2016, 21:56 [ТС] | 11 |
Дата вводится в формате ГГГГ-ММ-ДД, верно? я просто когда добавляю в таблицу данные, оно просто игнорирует это ограничение.
Код
insert into tablename_tbl (age) VALUES('2007-05-12')
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
||||||
30.06.2016, 02:22 | 12 | |||||
ммм... косяк.. забыл на кол-во дней в году умножить. разница в датах - это кол-во дней между ними!!!
либо еще есть функция age, которая возвращает тип данных интервал. тогда
и колонка "age" в данном случае должна приводиться к типу timestamp
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
01.07.2016, 01:09 [ТС] | 13 |
Да, вариант с функцией "age" однозначно лучше, так как количество дней в году может быть 365 и 366, уже будет не правильно =).
Название колонки изменил на "Birth Day" в даном случае это было возможным. Следующий вопрос =) Имеем пустую таблицу newzip_tbl Код
=> \d newzip_tbl Table "public.newzip_tbl" Column | Type | Modifiers -------------------+---------+----------- home_price | numeric | number_of_bedroom | numeric | Выражение: Код
INSERT INTO newzip_tbl(home_price, number_of_bedroom) SELECT(price, beds) FROM myzip_vew; Код
ERROR: INSERT has more target columns than expressions Поправьте пожалуйста!
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|
01.07.2016, 04:04 | 14 |
У SELECT надо убрать круглы скобки. Круглыми скобками вы создаете одну колонку типа record (запись), в которой содержаться ваши значения.
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
08.07.2016, 01:54 [ТС] | 15 |
Здравствуйье, подскажите еще пожалуйста как создать точно такую же таблицу
Код
Table "public.bookauthor" Column | Type | Modifiers -----------+---------+----------- isbn | text | not null au_number | numeric | not null Indexes: "bookauthor_pkey" PRIMARY KEY, btree (isbn, au_number) Foreign-key constraints: "bookauthor_au_number_fkey" FOREIGN KEY (au_number) REFERENCES author(au_id) "bookauthor_isbn_fkey" FOREIGN KEY (isbn) REFERENCES book(isbn) Код
=> create table t_bookauthor(isbn text NOT NULL references book(isbn), au_number numeric NOT NULL references author(au_id)); Код
=> \d t_bookauthor Table "public.t_bookauthor" Column | Type | Modifiers -----------+---------+----------- isbn | text | not null au_number | numeric | not null Foreign-key constraints: "t_bookauthor_au_number_fkey" FOREIGN KEY (au_number) REFERENCES author(au_id) "t_bookauthor_isbn_fkey" FOREIGN KEY (isbn) REFERENCES book(isbn) Код
Indexes: "bookauthor_pkey" PRIMARY KEY, btree (isbn, au_number) Спасибо! Добавлено через 6 часов 12 минут Понял, это Composite Surrogate Key который так и определяется, двумя колонками Код
=> create table t_bookauthor( isbn text NOT NULL references book(isbn), au_number numeric NOT NULL references author(au_id), primary key (isbn, au_number) ); Добрый день! Столкнулся с задачей в которой нужно назначить привилегии с ограничением на определенные даные. Например имеем две таблицы (relation) В одной имеем Индекс и Имя Городов, а в другой эти же индекс и остальная информация. Нужно назначить GRANT SELECT на таблицу где колонка city содержит только "Roseville" и "Rocklin". К сожалению следующее выражение не работает. Ошибка с "WHERE" Код
GRANT SELECT ON table_tbl TO userName WHERE city = 'Rocklin' AND city = 'Roseville' AND zips.zipcode = table_tbl.zip; Спасибо!
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|||||||||||
08.07.2016, 03:23 | 16 | ||||||||||
GRANT можно назначить на отдельные колонки (см. второе сверху определение в документации).
По поводу конкретных данных, такого нет. Возможно в качестве решения подойдет создание представлений с заданной выборкой, на которое уже можно назначить GRANT. То есть делаем
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
08.07.2016, 04:19 [ТС] | 17 |
Да спасибо! я так и сделал, просто думал что должна быть возможность назначения на строки.
0
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
21.07.2016, 07:29 [ТС] | 18 |
Подскажите в какой программе создается дизайн базы даных? Например вот этот http://wiki.sahanafoundation.o... :sqlschema
Или посоветуйте что нибудь для этой цели на английском языке.
0
|
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
|
|
21.07.2016, 07:59 | 19 |
Честно говоря однозначного ответа на этот вопрос нет. Я в своей практике использовал как минимум три средства: ERwin data modeler, dbschema и встроенное в PgAdmin средство. Конечно, ERwin data modeler - это монстр с мегавозможностями и мегаценой. dbschema поскромнее и ценник нормальный. PgAdmin по сравнению с ними глючное убожество, но простенькую базу спроектировать можно.
Еще немного пытался пользоваться SQL Power Architect. Вот, можете на него обратить внимание, community edition этого продукта доступна для скачивания. Все "монстры" на выбор перечислены здесь.
1
|
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
|
|
21.07.2016, 09:43 [ТС] | 20 |
Спасибо большое!
Добавлено через 3 минуты Нашел ERwin Data Modeler Community Edition тоже попробую что за монстр, хотя с моими базовыми знаниями я наверное не смогу еще его оценить по достоинству =)
0
|
21.07.2016, 09:43 | |
21.07.2016, 09:43 | |
Помогаю со студенческими работами здесь
20
Файл pgpass, запуск psql от имени другого пользователя без ввода пароля Несколько заданий Несколько заданий Несколько заданий Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |