如何仅在视图不存在时创建视图.如果确实存在,我想删除视图并重新定义它.我也想要没有警告或错误.
我的网站是使用在Ubuntu 11.10上的Postgresql 8.3服务器上运行的Drupal 6开发的.另外webmin版本1.590.
现在我想更新表中的记录,但是当我运行时:
UPDATE uac_institution_view SET status = '2' WHERE nid = '9950'
Run Code Online (Sandbox Code Playgroud)
它给我一个错误,如:
无法执行SQL:SQL UPDATE uac_institution_view SET status ='2'WHERERE nid ='9950'失败:错误:无法更新视图提示:您需要一个无条件的ON UPDATE DO INSTEAD规则.
问题是只有SELECT查询才有效.UPDATE,INSERT和DELETE命令不工作; 他们因上述错误而失败.
这是一个问题吗?语法错误?别的什么?
我people在MySQL上以两个日期命名这个表:
| Name | start_date | end_date |
| John | 2007-03-01 | 2009-10-12 |
| Mike | 2001-06-06 | 2010-12-01 |
Run Code Online (Sandbox Code Playgroud)
我想创建一个视图,让我按活动年份搜索,在活动年份之间start_date进行搜索end_date.所以,我希望得到一个包含多年的字段,如下所示:
| Name | activity_years |
| John | 2007,2008,2009 |
| Mike | 2001,2002,2003,2004,2005,2006,2007,2008,2009,2010 |
Run Code Online (Sandbox Code Playgroud)
我尝试了一些方法,但我无法得到它.因为我想创建一个视图,所以我必须在SELECT语句中完成所有操作,这让我很头疼.
我有一个在 mysql 数据库中创建 VIEW 的代码,该代码在我的本地服务器上运行良好。它可以正常创建和裁剪视图。但在我的在线服务器上它给出了错误
"CREATE VIEW command denied to user"
Run Code Online (Sandbox Code Playgroud)
对于在线数据库,我在数据库表单 PHPmyAdmin [Myadmin 位于本地主机在线] 中手动创建 VIEW,因此我有权在在线数据库上创建 VIEW。
但是用phpmysql_query就报错了command denied。是否有任何服务可以使用 php.ini 创建视图?
我想在 PostgreSQL 中为我的视图创建一个触发器。这个想法是所有新数据都必须满足插入条件。但这里出了点问题,我在手册中找不到答案。
CREATE OR REPLACE VIEW My_View AS
SELECT name, adress, count FROM club, band, country;
CREATE OR REPLACE FUNCTION insert() RETURNS TRIGGER AS $$
BEGIN
IF(NEW.count > 10) THEN
INSERT INTO My_View VALUES (NEW.name, NEW.adress, NEW.count);
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER insert INSTEAD OF INSERT ON My_View
FOR EACH ROW EXECUTE PROCEDURE insert();
Run Code Online (Sandbox Code Playgroud) 我有一个观点女巫是这样工作的:
CREATE VIEW v_myView as SELECT * FROM(
(SELECT a,b,c,d FROM table1)
UNION ALL
(SELECT a,b,c,d FROM table2)
UNION ALL
(SELECT a,b,c,d FROM table3)
.
.
.)
Run Code Online (Sandbox Code Playgroud)
当我使用视图时,我像这样过滤它:
SELECT * FROM v_myView WHERE a=x
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但需要一个小时(一个真正的小时,不是形象地说)。如果我会做这样的查询:
SELECT * FROM(
(SELECT a,b,c,d FROM table1 WHERE a=x)
UNION ALL
(SELECT a,b,c,d FROM table2 WHERE a=x)
UNION ALL
(SELECT a,b,c,d FROM table3 WHERE a=x)
.
.
.)
Run Code Online (Sandbox Code Playgroud)
这需要一分钟。这让我想知道是否有办法让 MySql 自动执行,这意味着该WHERE命令将在获取每个表之前工作
视图没有 rowid,这是预期的吗?例子:
create table t2 (u text);
insert into t2 values ('x');
insert into t2 values ('y');
create table t1 (t text, i integer);
insert into t1 values ('a',1);
insert into t1 values ('b',2);
insert into t1 values ('c',1);
insert into t1 values ('d',2);
create view v as select * from t1 join t2 on t1.i=t2.rowid;
select rowid,* from t1;
ro t i
-- -- --
1 a 1
2 b 2
3 c 1
4 d 2
select rowid,* …Run Code Online (Sandbox Code Playgroud) 我有一个使用多个连接的视图的 SQL 查询,该查询偶尔运行非常慢 - 比正常情况慢很多,使查询几乎无法使用。
我从视图中复制了查询并进行了试验并在https://dba.stackexchange.com/a/60180/52607找到了解决方案- 如果我添加
OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)
到查询结束时,它的运行速度提高了约 6 倍。
我现在尝试将 OPTION 调整为原始视图,但 SQL Server/SSMS 告诉我
Incorrect syntax near the keyword 'OPTION'.
Run Code Online (Sandbox Code Playgroud)
如何将此选项添加到视图中,以便视图的结果查询同样快?
(将选项添加到视图上的查询并没有导致任何加速。这看起来像这样:
select * from vMyView
where SomeDate >= CONVERT(Datetime, '2017.09.20')
OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)
我想我必须直接将此选项用于 vMyView - 如果可能的话。)
有时,在批量数据加载时,建议临时删除表上的约束和索引.但是当我这样做时,我遇到了一些依赖问题.我的简化示例:
CREATE TABLE public.t_place_type
(
id serial NOT NULL,
c_name character varying(100),
CONSTRAINT pk_t_place_type PRIMARY KEY (id)
);
CREATE TABLE public.t_place
(
id serial NOT NULL,
c_name character varying(50),
id_place_type integer,
CONSTRAINT pk_t_place PRIMARY KEY (id),
CONSTRAINT fk_t_place_t_place_type FOREIGN KEY (id_place_type)
REFERENCES public.t_place_type (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE OR REPLACE VIEW public.v_place AS
SELECT p.id,
p.c_name,
pt.c_name AS c_place_type
FROM t_place p
LEFT JOIN t_place_type pt ON pt.id = p.id_place_type
GROUP BY …Run Code Online (Sandbox Code Playgroud) 我有 2 个表都具有唯一约束,1 个连接这 2 个表的视图和一个INSTEAD OF INSERT允许INSERT或UPDATE在视图上的触发器。
一切正常INSERT,UPDATE但如果我这样做,INSERT .. ON CONFLICT(tableAColumn,tableBColumn) DO UPDATE我会收到错误消息:
[42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
Run Code Online (Sandbox Code Playgroud)
如果视图可以自动更新,那么我想我可以只使用 aWITH CHECK OPTION但是我如何使用INSTEAD OF INSERT触发器来做到这一点?
或者另一种方式来询问如何使视图具有与构建它的表相同的约束?
sql-view ×10
sql ×5
mysql ×4
postgresql ×4
sql-update ×2
triggers ×2
constraints ×1
date ×1
plpgsql ×1
query-hints ×1
sql-insert ×1
sql-server ×1
sqlite ×1
union ×1