当前位置: 首页 > news >正文

北京网站建设公司华网网站建设作品

北京网站建设公司华网,网站建设作品,wap是什么意思歌词,网上国网下载我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作: MySQL和标准SQL特权系统之间有一些区别。例如,在MySQL中,删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权…

我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作:

MySQL和标准SQL特权系统之间有一些区别。例如,在MySQL中,删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权。

CASTCAST()函数不支持强制转换为REAL或BIGINT。

SELECT INTO TABLE 语法差异

MySQL服务器不支持SELECT ... INTO TABLE Sybase数据库SQL扩展。相反,MySQL服务器支持INSERT INTO ... SELECT标准SQL语法,这基本上是一样的。例如:

INSERT INTO tbl_temp2 (fld_id)SELECT tbl_temp1.fld_order_idFROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

或者,您可以使用SELECT ... INTO OUTFILE或CREATE TABLE ... SELECT。

您可以将SELECT ... INTO与用户定义的变量一起使用。同样的语法也可以在使用游标和局部变量的存储过程中使用。

UPDATE 语法差异

如果在表达式中访问要更新的表中的列,UPDATE将使用该列的当前值。以下语句中的第二个赋值将col2设置为当前(更新)的col1值,而不是原始的col1值。结果是col1和col2具有相同的值。这种行为与标准SQL不同。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
外键约束差异

外键约束的MySQL实现在以下关键方面不同于SQL标准:

1、如果父表中有多行具有相同的引用键值,InnoDB会执行外键检查,就好像其他具有相同键值的父行不存在一样。例如,如果您定义了RESTRICT类型约束,并且有一个子行具有多个父行,InnoDB不允许删除任何父行。这在以下示例中显示:

mysql> CREATE TABLE parent (->     id INT,->     INDEX (id)-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.04 sec)mysql> CREATE TABLE child (->     id INT,->     parent_id INT,->     INDEX par_ind (parent_id),->     FOREIGN KEY (parent_id)->         REFERENCES parent(id)->         ON DELETE RESTRICT-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)mysql> INSERT INTO parent (id) ->     VALUES ROW(1), ROW(2), ROW(3), ROW(1);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0mysql> INSERT INTO child (id,parent_id) ->     VALUES ROW(1,1), ROW(2,2), ROW(3,3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> DELETE FROM parent WHERE id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
(`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT)

2、如果ON UPDATE CASCADE或ON UPDATE SET NULL递归以更新它之前在同一级联期间更新过的同一表,则其行为类似于RESTRICT。这意味着您不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作。这是为了防止级联更新导致无限循环。另一方面,自引用ON DELETE SET NULL是可能的,因为自引用也是可能的ON DELETE CASCADE。级联操作的嵌套深度不得超过15级。

3、在插入、删除或更新多行的SQL语句中,逐行检查外键约束(如唯一约束)。在执行外键检查时,InnoDB会在它必须检查的子记录或父记录上设置共享行级锁。MySQL立即检查外键约束;检查不会延迟到事务提交。根据SQL标准,默认行为应该是延迟检查。即只有在处理完整个SQL语句后才检查约束。这意味着无法使用外键删除引用自身的行。

4、没有存储引擎(包括InnoDB)可以识别或强制执行referential-integrity约束定义中使用的MATCH子句。使用显式MATCH子句没有指定的效果,它会导致忽略ON DELETE和ON UPDATE子句。应避免指定MATCH。

SQL标准中的MATCH子句控制复合(多列)外键中的NULL值在与引用表中的主键进行比较时如何处理。MySQL本质上实现了MATCH SIMPLE定义的语义学,它允许外键全部或部分NULL。在这种情况下,可以插入包含此类外键的(子表)行,即使它没有拟合引用(父)表中的任何行。(可以使用触发器实现其他语义学。)

5、引用非UNIQUE键的FOREIGN KEY约束不是标准SQL而是现在已弃用的InnoDB扩展,必须通过设置restrict_fk_on_non_standard_key启用。在MySQL的未来版本中可能删除对使用非标准键的支持,不建议使用他们。

根据SQL标准,NDB存储引擎需要在作为外键引用的任何列上显式唯一键(或主键)。

6、对于不支持外键的存储引擎(如MyISAM),MySQL Server会解析并忽略外键规范。

7、MySQL解析但忽略“内联REFERENCES规范”(在SQL标准中定义),其中引用定义为列规范的一部分。MySQL仅在指定为单独的FOREIGN KEY规范的一部分时接受REFERENCES子句。定义列以使用REFERENCES tbl_name(col_name)子句没有实际效果,仅作为备忘录或注释,告诉您当前定义的列在另一个表中详情可见。使用此语法时必须注意:

a、MySQL不执行任何类型的检查来确保col_name确实存在于tbl_name中(甚至tbl_name本身存在)。

b、MySQL不会对tbl_name执行任何类型的操作,例如删除行以响应对您正在定义的表中的行执行的操作;换句话说,这种语法不会产生任何ON DELETE或ON UPDATE行为。(尽管您可以编写ON DELETE或ON UPDATE子句作为REFERENCES的一部分,但它也会被忽略。)

c、此语法创建一个列;它不创建任何类型的索引或键。

您可以将这样创建的列用作连接列,如下所示:

CREATE TABLE person (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,name CHAR(60) NOT NULL,PRIMARY KEY (id)
);CREATE TABLE shirt (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,style ENUM('t-shirt', 'polo', 'dress') NOT NULL,color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),PRIMARY KEY (id)
);INSERT INTO person VALUES (NULL, 'Antonio Paz');SELECT @last := LAST_INSERT_ID();INSERT INTO shirt VALUESROW(NULL, 'polo', 'blue', @last),ROW(NULL, 'dress', 'white', @last),ROW(NULL, 't-shirt', 'blue', @last);INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');SELECT @last := LAST_INSERT_ID();INSERT INTO shirt VALUESROW(NULL, 'dress', 'orange', @last),ROW(NULL, 'polo', 'red', @last),ROW(NULL, 'dress', 'blue', @last),ROW(NULL, 't-shirt', 'white', @last);SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+SELECT s.* FROM person p INNER JOIN shirt sON s.owner = p.id
WHERE p.name LIKE 'Lilliana%'AND s.color <> 'white';+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

以这种方式使用时,REFERENCES不会显示在SHOW CREATE TABLE或DESCRIBE的输出中:

mysql> SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
'--'作为SQL注解的开头

标准SQL使用C语法/* this is a comment */用于注释,MySQL服务器也支持这种语法。MySQL还支持对这种语法的扩展,使MySQL特定的SQL能够嵌入到注释中。

MySQL服务器也使用#作为开始注释字符。这是不标准的。

标准SQL还使用"--"作为开始注释序列。MySQL服务器支持--注释样式的变体;--开始注释序列被接受,但必须后跟空格或换行符等空格字符。该空格旨在防止使用如下结构生成的SQL查询出现问题,这些结构会更新余额以反映费用:

UPDATE account SET balance=balance-charge
WHERE account_id=user_id

考虑一下当charge具有负值时会发生什么,例如-1,这可能是将金额记入账户的情况。在这种情况下,生成的语句如下所示:

UPDATE account SET balance=balance--1
WHERE account_id=5752;

balance--1是有效的标准SQL,但是--被解释为注释的开始,并且表达式的一部分被丢弃。结果是一个与预期含义完全不同的语句:

UPDATE account SET balance=balance
WHERE account_id=5752;

该语句的值根本不会发生任何变化。为了防止这种情况发生,MySQL需要在--后面加上一个空格字符,以便在MySQL服务器中将其识别为开始注释序列,以便始终可以安全使用balance--1之类的表达式。

http://www.yayakq.cn/news/60343/

相关文章:

  • 网站友情链接wordpress 4.7.3 乱码
  • 网站服务器地址查询seo概念的理解
  • 网站广告模板代码wordpress4.7.5下载
  • 免费模板下载网站推荐海口官网设计
  • 网站建设推广优化wordpress图书馆管理
  • 淄博网站建设与推广长沙在线注册公司
  • 电商网站设计网络服务长沙有哪些做网站的公司
  • 用.net做网站人工智能在线ai写作网站
  • 域名之后怎么做网站电子商务公司图片
  • 做网站多少钱一个网站的站点地图怎么做
  • 江西建设职业技术学院迎新网站武进网站建设咨询
  • 清华紫光是可以做网站的吗农业开发公司好名字
  • 上传网站视频要怎么做才清楚长沙如何做百度的网站推广
  • 微信网站页面制作上海搬家公司哪家便宜
  • 怎么做祝福网站公路开发公司
  • 哪些公司做网站免费学校网站系统
  • php网站开发目的提供网站建设工具的品牌有哪些
  • 网站后台模板关联自己做的网站网络管理系统的每个节点都包含一组与管理有关的软件
  • htnl5 做的视频网站站长平台社区
  • 网站的关键词报价的网站海南智能网站建设设计
  • 巨野网站定制高端网站建设案例
  • 沈阳制作公司网站英语培训网站模板
  • php网站做语言包兰溪高端网站建设公司
  • 有域名有网站怎么解决办法百度快照手机版
  • 栖霞建设官方网站成都市网站建设费用及企业
  • 网站建设丷金手指专业十五上海公司变更联贝财务优势
  • 福州自助建站如何建设个人网站凡科怎么样
  • 网站首页没有收录微盟小程序模板
  • 广州网站建设公司哪个好营销网红
  • 住房和城乡建设部网站中国建造师网襄阳手机网站建设公司