• 关于

    数据库values限制

    的搜索结果

回答

胜哥 作者出的题目建表的sql能提供下吗? 35题 select sum(count) as num,id from ( select count(*) count,requester_id as id from request_accepted GROUP BY requester_id UNION select count(*) count ,accepter_id as id from request_accepted GROUP BY accepter_id )t GROUP BY id ORDER BY num desc limit 1 33题 1.初始化: CREATE TABLE `Orders` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `shop_id` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL, `pay_date` datetime DEFAULT NULL, `pay_no` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (1, '1001', '2020-01-11 16:43:25', 5); INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (2, '1001', '2020-01-10 16:43:57', 3); INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (3, '1002', '2020-01-17 16:44:09', 4); INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (4, '1002', '2020-01-11 16:44:24', 2); INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (5, '1002', '2020-01-11 16:44:24', 1); INSERT INTO `Orders`(`id`, `shop_id`, `pay_date`, `pay_no`) VALUES (6, '1002', '2020-01-12 16:44:24', 0); 2.SQL 方法1:GROUP_CONCAT实现(数据库版本[5.7.16]) select * from Orders where id in ( select SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY pay_date,pay_no),',',1) from Orders GROUP BY shop_id ) 方法2:子查询实现(数据库版本[5.6.16]) select t.* from ( select * from Orders ORDER BY pay_date ,pay_no )t GROUP BY t.shop_id; 方法2有可能是不行的,不知道是数据库版本问题还是哪里设置没有 3.注意: GROUP_CONCAT有长度限制,记录过多需要注意设置以下配置 SET @@global.group_concat_max_len=数字
1074800250556052 2020-01-13 10:04:51 0 浏览量 回答数 0

问题

云数据库 OceanBase中的range分区

[backcolor=transparent]语法 ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)}     (partition_definition [, partit...
云栖大讲堂 2019-12-01 21:28:31 1008 浏览量 回答数 0

问题

Hibernate是否可以使用MySQL的“ ON DUPLICATE KEY UPDA?mysql

MySQL支持一种“ INSERT ... ON DUPLICATE KEY UPDATE ...”语法,该语法允许您“盲目”插入数据库,如果存在则回退到更新现有记录。 当您要快速隔离事务并且要更新的值取决于数...
保持可爱mmm 2020-05-17 17:41:03 2 浏览量 回答数 1

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

回答

文档得读下先http://dangdangdotcom.github.io/sharding-jdbc/post/limitations/ SQL语句限制 不支持DDL语句 不支持子语句 不支持UNION 和 UNION ALL 不支持特殊INSERT 每条INSERT语句只能插入一条数据,不支持VALUES后有多行数据的语句 不支持DISTINCT聚合 ######schema要先行###### 你是什么数据库? 那为什么不用mycat? ######mycat能支持动态分表吗######真是到了那个程度,考虑Oracle 12c把。 ###### sharding-jdbc和mycat使用不同的理念,sharding-jdbc目前是基于jdbc驱动,无需额外的proxy,因此也无需关注proxy本身的高可用。是以jar包的形式提供服务的(类似于dubbo)。可以根据自己的喜好选择。除了接入端不同(jdbc vs mysql协议),其他的路由,sql解析,结果归并流程的大致相似。 ######我也想做这个的一个功能 根据业务id动态分表
kun坤 2020-06-04 10:58:36 0 浏览量 回答数 0

问题

最佳实践 -MySQL-RDS for MySQL 5.7如何创建用户

本文将介绍以下几个知识点: 如何在RDS上创建数据库用户?如何通过创建的用户来访问数据库?如何用SQL语句创建用户并给用户授权? 文中所述操作步骤为RDS for MySQL 5.7版...
李沃晟 2019-12-01 21:40:06 764 浏览量 回答数 0

问题

什么是REPLACE 语句

标准语法REPLACE [INTO] table_name (column_name [, ...]) VALUES (replace_expr_list) [, (replace_expr_list) [, ...]] 限制说明 ...
云栖大讲堂 2019-12-01 21:27:45 1127 浏览量 回答数 0

问题

SQL 兼容性怎么样?

[font=PingFangSC, "]DRDS 高度兼容 MySQL 协议和语法,但由于分布式数据库和单机数据库存在较大的架构差异,存在 SQL 使用限制。相关兼容性和 SQL 限制描述如下。 ...
猫饭先生 2019-12-01 21:19:24 905 浏览量 回答数 0

回答

public synchronized void insert() {     ... } 试试这个。######您好,请问 如果我不用这种同步的方法, 只用事务隔离可以解决吗###### 加synchronized比较简单暴力,性价比最好。更优的方式是添加流水单号,根据流水单号进行同步或者异步添加。但是需要实现很多内容。######简单暴力、好处是 Java 端当掉了并发的压力,数据库还是一个个进出,压力不会落到数据库上。哈哈哈######  transactionl###### 两次插入请求和事务没太大关系,上面的加synchronize关键字在一台机器上的时候算是一个办法,但不是可行的办法,这相当于把所有任务都串行了,浪费服务器资源。这种情况可以有几种处理办法: 1. 数据库加唯一索引,如果有唯一列可以标识的话 2. 两行重复在事务完成之后做一个删除判断,将id比较小的(大的也OK,只要逻辑一致)几条删掉,只保留一条 3. 加分布式锁,这也需要唯一标识来加锁 4. 不完美的解决办法,前端保证短时间内只发一次请求(正常用户没有问题,容易被hack,但可以挡正常流量,这应该是必须要做的)###### 引用来自“52iSilence7”的评论 两次插入请求和事务没太大关系,上面的加synchronize关键字在一台机器上的时候算是一个办法,但不是可行的办法,这相当于把所有任务都串行了,浪费服务器资源。这种情况可以有几种处理办法: 1. 数据库加唯一索引,如果有唯一列可以标识的话 2. 两行重复在事务完成之后做一个删除判断,将id比较小的(大的也OK,只要逻辑一致)几条删掉,只保留一条 3. 加分布式锁,这也需要唯一标识来加锁 4. 不完美的解决办法,前端保证短时间内只发一次请求(正常用户没有问题,容易被hack,但可以挡正常流量,这应该是必须要做的) 增加分布式锁,注意释放锁死锁情况。 楼上说的比较ID大小的方法仅限于ID是自增情况,如果是UUID不适用。  ######  事务和并发问题 事务和并发,这两个并不是一个对等的概念。 先给出简单解决方案,具体的实现在下文会给出。   第一种方式(推荐):   给数据添加唯一索引,这种方式能解决,但是会影响效率。   第二种方式:   如果是分布式项目,可以使用分布式锁,具体可以通过redis或者zookeeper来实现,   如果是单点项目,可以使用同步代码块来实现。   第三种方式(推荐):   使用insert where not exists 语句来限制插入。   第四种方式:   使用redis的`SETNX`方法来实现。     在具体业务中,我们更推荐第一种方式和第三种方式相结合的形式,但是大多数业务场景中,往往只采用第一种方式即可。   具体解决方案和思路。   在关系型数据库中(如MySql),一个事务可以是一条SQL语句,或者一组SQL语句。 其展现形式大致如下:   ``` BEGIN; /*开启事务*/ SQL 1; SQL 2; SQL 3; COMMIT;/ROLLBACK; /*提交或回滚*/ ```   他的具体表现是,上面一组SQL(SQL 1/SQL 2/SQL 3)在执行时,他们同时生效或者同时失败。   并发场景重现   如题所诉,假设`报名表`由下列字段构成   ``` CREATE TABLE `sign_up` (   `user_id` varchar(32) NOT NULL COMMENT '用户ID',   `create_time` datetime NOT NULL COMMENT '用户报名时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ```   题中目前的操作应该大致如下:   ``` BEGIN; /*step1:从数据库获取当前用户是否已经报名*/ SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = ''; /*step2:如果用户未报名,则在数据库中插入数据*/ INSERT INTO sign_up values('',NOW()); COMMIT; ``` 此时代码本身是有漏洞的,当请求并发时,可能触发下列场景。   请求A: `SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = '123';` 请求B: `SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = '123';` 请求A: `INSERT INTO sign_up values('123',NOW());` 请求B: `INSERT INTO sign_up values('123',NOW());`   数据库在未添加唯一索引的场景下会插入两条数据,添加唯一索引的场景下则会报错`唯一索引冲突`。   此时虽然开启了事务,但是在整个执行过程中,如果没有开启唯一索引,SQL都是执行成功的,不会触发`ROLLBACK`; 如果开启了唯一索引,此时应该也就没有这个疑问了。   解决方案 针对这种问题,其实可以采取几种常见的方式来解决。 第一种方式: 在单点部署的工程中,可以通过对核心代码部分添加同步来解决,比如使用`synchronized`或者`ReentrantLock`来实现, 限制部分代码的并发访问,但是这样必然会降低该接口的效率,而且,在分布式工程内,该解决方法并不适用 ,所以不建议使用。   第二种方式: 通过分布式一致性锁来实现 针对第一种方案,通过分布式一致性锁取代常规同步块,进而实现在分布式工程中将并发转为同步。 分布式一致锁的实现方案有很多种,常见的有基于redis实现和基于zookeeper实现。   第三种方式:给数据库字段添加唯一索引 `ALTER TABLE sign_up ADD UNIQUE INDEX `user_id`(`user_id`);` 或者 `CREATE UNIQUE INDEX user_id ON sign_up(user_id); ` 这种方式通过在数据库端来限制表中不得同时存在同一用户的多条数据,这种方式实现比较简单,推荐使用,但是通过抛异常的形式来实现功能,会损失部分效率。   第四种方式: 使用`insert where not exists` 类型的语句来实现 ``` INSERT INTO sign_up (user_id, create_time) SELECT     '123', NOW() FROM     DUAL WHERE     NOT EXISTS (         SELECT             user_id         FROM             sign_up         WHERE             user_id = '123'     ); ```   这种方式,实现上将select 语句和insert语句合并到一起执行,避免了题中描述的并发问题,因为从实现上`insert`语句的执行依赖于`select`语句的查询结果 ,从根本上就避免了题中涉及到的并发问题,使用这种方式调用端可以根据`SQL`执行影响的行数来判断是否插入成功,进而执行对应的业务逻辑 ,这种方式普适性较强,推荐使用。   第五种方式,借助`redis`的`SETNX`方法来实现 ``` SETNX 是 ‘SET if Not eXists’的简称,命令格式大致如下:SETNX [key] [value]. 作用是:将指定的[key]的值设为[value],如果给定的key已经存在,则SETNX不做任何操作。 设置成功,该方法返回1,设置失败,该方法返回0. ``` 借助`SETNX`命令,我们可以将题中的`select`语句改为该方式,根据`SETNX`的返回值来执行相应的业务逻辑。 tips: 该方法需要注意redis的key值失效时间。   上诉五种方式都可以解决该问题。   问题产生的本质原因   下面再简单聊一下,并发和事务的问题。   事务有四大特性:A(原子性),C(一致性),I(隔离性),D(持久性)。   其中   - 原子性表示:事务所包含的所有操作,要么全部成功,要么全部失败。   - 一致性表示:事务执行前后必须处于一致性状态。   - 隔离性:当多个用户并发访问数据库的时候,多个并发线程相互隔离。   - 持久性:事务一旦被提交,对数据库的改变是永久性的,即使数据库系统遭遇故障也不会丢失提交的事务。   出现题中的问题,应该是混淆了原子性和隔离性的概念,原子性只是保证了事务中包含的操作要么同时成功,要么同时失败。 他并不会帮助我们处理业务代码中产生的并发问题,同理隔离性要求处理的是数据库并发,而不是业务并发。   在题中,业务代码内的两条SQL在没有配置唯一索引的场景下,并发时,并不会产生SQL执行失败的场景,两条语句默认都是成功的 ,这也就意味着事务最终是提交(`COMMIT`)的,进而导致数据库出现两条数据。   为了解决这种问题,我们的思路往往可以放在如何在业务层面将会出现并发问题的代码原子化,比如本文给出的解决方案,均是基于此而实现的。  ###### 加锁处理、唯一索引、基于redis防止重复提交###### 1.数据库的唯一索引 2.如果不是分布式部署的话上java锁 3.如果是分布式的话上基于redis的分布式锁 4.最好用lock锁 锁代码就可 没必要锁整个方法
kun坤 2020-06-07 22:25:21 0 浏览量 回答数 0

问题

RDS for MySQL 5.7如何创建用户

本文将介绍以下几个知识点: 如何在RDS上创建数据库用户?如何通过创建的用户来访问数据库?如何用SQL语句创建用户并给用户授权? 文中所述操作步骤为RDS for MySQL 5.7版...
云栖大讲堂 2019-12-01 21:43:32 1327 浏览量 回答数 0

问题

云数据库 OceanBase中的分区管理

分区管理主要是指添加、删除、重新定义、合并或拆分已经存在的分区。所有这些操作都可以通过使用 ALTER TABLE 命令的分区扩展来实现。 RANGE分区 删除分区以及分区数据 [backcolor=transpar...
云栖大讲堂 2019-12-01 21:28:33 1007 浏览量 回答数 0

回答

使用准备好的语句和参数化查询。这些是独立于任何参数发送到数据库服务器并由数据库服务器解析的SQL语句。这样,攻击者就不可能注入恶意SQL。 您基本上有两种选择可以实现此目的: 使用PDO(对于任何受支持的数据库驱动程序): $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute([ 'name' => $name ]); foreach ($stmt as $row) { // Do something with $row } 使用MySQLi(对于MySQL): $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string' $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row } 如果你连接到MySQL之外的数据库,有一个特定的驱动程序,第二个选项,你可以参考一下(例如,pg_prepare()和pg_execute()PostgreSQL的)。PDO是通用选项。 正确设置连接 注意,当PDO用于访问MySQL数据库时,默认情况下不使用真实的预处理语句。要解决此问题,您必须禁用对准备好的语句的仿真。使用PDO创建连接的示例如下: $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 在上面的示例中,错误模式不是严格必需的,但建议添加它。这样,Fatal Error当出现问题时脚本不会以a停止。并且它为开发人员提供了解决catch任何thrown为PDOExceptions的错误的机会。 但是,第一行是强制性的,setAttribute()它告诉PDO禁用模拟的预备语句并使用实际的预备语句。这可以确保在将语句和值发送到MySQL服务器之前,不会对PHP进行解析(这样可能会使攻击者没有机会注入恶意SQL)。 尽管可以charset在构造函数的选项中设置,但是必须注意,PHP的“较旧”版本(在5.3.6之前)静默忽略了DSN中的charset参数。 说明 传递给您的SQL语句prepare由数据库服务器解析和编译。通过指定参数(如上例中的?参数或命名参数:name),您可以告诉数据库引擎要在何处进行过滤。然后,当您调用时execute,准备好的语句将与您指定的参数值组合在一起。 这里重要的是参数值与已编译的语句组合,而不是与SQL字符串组合。SQL注入通过在创建要发送到数据库的SQL时欺骗脚本使其包含恶意字符串来起作用。因此,通过将实际的SQL与参数分开发送,可以减少因意外获得最终结果的风险。 使用预处理语句发送的任何参数都将被视为字符串(尽管数据库引擎可能会进行一些优化,因此参数最终也可能以数字结尾)。在上面的示例中,如果$name变量包含'Sarah'; DELETE FROM employees结果,则仅是搜索字符串"'Sarah'; DELETE FROM employees",并且最终不会得到空表。 使用准备好的语句的另一个好处是,如果您在同一会话中多次执行同一条语句,它将仅被解析和编译一次,从而使您获得了一些速度上的提高。 哦,既然您询问了如何进行插入,这是一个示例(使用PDO): $preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStatement->execute([ 'column' => $unsafeValue ]); 准备好的语句可以用于动态查询吗? 尽管您仍可以对查询参数使用准备好的语句,但是无法对动态查询本身的结构进行参数化,并且无法对某些查询功能进行参数化。 对于这些特定方案,最好的办法是使用白名单过滤器来限制可能的值。 // Value whitelist // $dir can only be 'DESC', otherwise it will be 'ASC' if (empty($dir) || $dir !== 'DESC') { $dir = 'ASC'; }
保持可爱mmm 2020-05-08 09:26:01 0 浏览量 回答数 0

问题

什么是INSERT 语句

标准语法INSERT [IGNORE] [INTO] table_name (column_name [, ...]) VALUES (insert_expr_list) [, insert_expr_list [, ...]] [on d...
云栖大讲堂 2019-12-01 21:27:44 1042 浏览量 回答数 0

问题

DRDS 错误代码如何解决?

本文档列出了 DRDS 返回的常见错误码及解决方法。 TDDL-4006 ERR_TABLE_NOT_EXIST TDDL-4007 ERR_CANNOT_FETCH_TABLE_META TDDL-4100 ERR_ATOM_NOT...
猫饭先生 2019-12-01 21:21:21 7993 浏览量 回答数 0

回答

AliSQL提供了Sequence Engine,简化获取序列值的复杂度。 Sequence Engine介绍 在持久化数据库系统中,无论是单节点中的业务主键,还是分布式系统中的全局唯一值,亦或是多系统中的幂等控制,单调递增的唯一值是常见的需求。不同的数据库系统有不同的实现方法,例如MySQL提供的AUTO_INCREMENT,Oracle、SQL Server提供的SEQUENCE。 在MySQL数据库中,如果业务希望封装唯一值,例如增加日期、用户等信息,使用AUTO_INCREMENT的方法会带来很大不便,在实际的系统设计中,也存在不同的折中方法: 序列值由Application或者Proxy来生成,不过弊端很明显,状态带到应用端会增加扩容和缩容的复杂度。 序列值由数据库通过模拟的表来生成,但需要中间件来封装和简化获取唯一值的逻辑。 AliSQL提供了Sequence Engine,通过引擎的设计方法,尽可能地兼容其他数据库的使用方法,简化获取序列值复杂度。 Sequence Engine实现了MySQL存储引擎的设计接口,但底层的数据仍然使用现有的存储引擎,例如InnoDB或者MyISAM来保存持久化数据,兼容现有的第三方工具(例如Xtrabackup),所以Sequence Engine仅仅是一个逻辑引擎。 Sequence Engine通过Sequence Handler接口访问Sequence对象,实现NEXTVAL的滚动、缓存的管理等,最后透传给底层的基表数据引擎,实现最终的数据访问。 前提条件 实例版本为RDS MySQL 5.7/8.0。 使用限制 Sequence不支持子查询和join查询。 可以使用SHOW CREATE TABLE或者SHOW CREATE SEQUENCE来访问Sequence结构,但不能使用SHOW CREATE SEQUENCE访问普通表。 不支持建表的时候指定Sequence引擎,Sequence表只能通过创建Sequence的语法来创建。 创建Sequence 创建Sequence语句如下: CREATE SEQUENCE [IF NOT EXISTS] schema.sequence_name [START WITH ] [MINVALUE ] [MAXVALUE ] [INCREMENT BY ] [CACHE | NOCACHE] [CYCLE | NOCYCLE] ; 参数说明如下。 参数 说明 START Sequence的起始值。 MINVALUE Sequence的最小值。 MAXVALUE Sequence的最大值。 说明 如果有参数NOCYCLE,到达最大值后会报如下错误: ERROR HY000: Sequence 'db.seq' has been run out. INCREMENT BY Sequence的步长。 CACHE/NOCACHE 缓存的大小,为了性能考虑,可以设置较大的缓存,但如果遇到实例重启,缓存内的值会丢失。 CYCLE/NOCYCLE 表示Sequence如果用完了后,是否允许从MINVALUE重新开始。取值: CYCLE:允许; NOCYCLE:不允许。 示例: create sequence s start with 1 minvalue 1 maxvalue 9999999 increment by 1 cache 20 cycle; 为了兼容MySQL Dump的备份方式,您也可以使用另外一种创建Sequence的方法,即创建Sequence表并插入一行初始记录。示例如下: CREATE SEQUENCE schema.sequence_name ( currval bigint(21) NOT NULL COMMENT 'current value', nextval bigint(21) NOT NULL COMMENT 'next value', minvalue bigint(21) NOT NULL COMMENT 'min value', maxvalue bigint(21) NOT NULL COMMENT 'max value', start bigint(21) NOT NULL COMMENT 'start value', increment bigint(21) NOT NULL COMMENT 'increment value', cache bigint(21) NOT NULL COMMENT 'cache size', cycle bigint(21) NOT NULL COMMENT 'cycle state', round bigint(21) NOT NULL COMMENT 'already how many round' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0); COMMIT; Sequence表介绍 由于Sequence是通过真正的引擎表来保存的,所以通过查询创建语句看到仍然是默认的引擎表。示例如下: SHOW CREATE [TABLE|SEQUENCE] schema.sequence_name; CREATE SEQUENCE schema.sequence_name ( currval bigint(21) NOT NULL COMMENT 'current value', nextval bigint(21) NOT NULL COMMENT 'next value', minvalue bigint(21) NOT NULL COMMENT 'min value', maxvalue bigint(21) NOT NULL COMMENT 'max value', start bigint(21) NOT NULL COMMENT 'start value', increment bigint(21) NOT NULL COMMENT 'increment value', cache bigint(21) NOT NULL COMMENT 'cache size', cycle bigint(21) NOT NULL COMMENT 'cycle state', round bigint(21) NOT NULL COMMENT 'already how many round' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 查询语法 Sequence支持的查询语法如下: SELECT [nextval | currval | *] FROM seq; SELECT nextval(seq),currval(seq); SELECT seq.currval, seq.nextval from dual;
游客yl2rjx5yxwcam 2020-03-08 13:32:47 0 浏览量 回答数 0

问题

MaxCompute最佳实践:与标准SQL的主要区别及解决方法

本文档将从习惯使用关系型数据库SQL的用户实践角度出发,列举用户在使用MaxCompute SQL时比较容易遇见的问题。具体的MaxCompute SQL语法建议考对应的 文档,本文配合文档使用可以快速上手Max...
行者武松 2019-12-01 22:09:44 1366 浏览量 回答数 0

问题

【精品问答】Python二级考试题库

1.关于数据的存储结构,以下选项描述正确的是( D ) A: 数据所占的存储空间量 B: 存储在外存中的数据 C: 数据在计算机中的顺序存储方式 D: 数据的逻辑结构在计算机中的表示 2.关于线性...
珍宝珠 2019-12-01 22:03:38 7177 浏览量 回答数 3

问题

Sequence 限制及注意事项

限制与注意事项 Time-based Sequence 用于表中自增列时,该列必须使用 BIGINT 类型; 转换 Sequence 类型时,必须指定 START WITH 起始值;...
猫饭先生 2019-12-01 21:20:49 933 浏览量 回答数 0

回答

例如: <?php /****************************************************************************** 参数说明: $max_file_size : 上传文件大小限制, 单位BYTE $destination_folder : 上传文件路径 ******************************************************************************/ include "conn.php"; //上传文件类型列表 $uptypes=array( 'image/jpg', 'image/jpeg', 'image/png', 'image/pjpeg', 'image/gif', 'image/bmp', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/pdf', 'application/msword', 'image/x-png' ); $max_file_size=2000000; //上传文件大小限制, 单位BYTE $destination_folder="up1/"; //上传文件路径 ?> <html> <head> <title>文件上传程序</title> <style type="text/css"> <!-- body { font-size: 9pt; } input { background-color: #66CCFF; border: 1px inset #CCCCCC; } --> </style> </head> <body> <form enctype="multipart/form-data" method="post" name="upform"> 上传文件: <input name="upfile" type="file"> <input type="submit" value="上传"><br> 允许上传的文件类型为:<?php echo implode(',',$uptypes)?> </form> <?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (!is_uploaded_file($_FILES["upfile"]['tmp_name'])) //是否存在文件 { echo "您还没有选择文件!"; exit; } $file = $_FILES["upfile"]; if($max_file_size < $file["size"]) //检查文件大小 { echo "您选择的文件太大了!"; exit; } if(!in_array($file["type"], $uptypes)) //检查文件类型 { echo "文件类型不符!".$file["type"]; exit; } if(!file_exists($destination_folder)) { mkdir($destination_folder); } $filename=$file["tmp_name"]; $image_size = getimagesize($filename); $pinfo=pathinfo($file["name"]); $ftype=$pinfo['extension']; $destination = $destination_folder.time().".".$ftype; if (file_exists($destination) && $overwrite != true) { echo "同名文件已经存在了"; exit; } if(!move_uploaded_file ($filename, $destination)) { echo "移动文件出错"; exit; } $pinfo=pathinfo($destination); $fname=$pinfo['basename']; echo " <font color=red>已经成功上传</font><br>完整地址: <font color=blue>http://localhost/new/".$destination_folder.$fname."</font><br>"; echo "<br> 大小:".$file["size"]." bytes"; echo '<br>'; //将数据插入到数据库中 $dizhi = "http://localhost/new/"."$destination_folder"."$fname"; $name = $file['name']; $sql = "insert into `excel`(`id`,`dizhi`,`name`) values ('NULL','$dizhi','$name')"; mysql_query($sql); echo "数据插入成功"; } ?> </body> [/php]
小旋风柴进 2019-12-02 01:59:33 0 浏览量 回答数 0

回答

公共错误码 更新时间:2020-03-20 14:55:04 编辑 我的收藏 HttpCode 错误码 错误信息 描述 400 AppCategoryNotMatchWithStacks The application type declared in the application does not match the type of the software stack. Please make sure that the types are consistent and then try again. 应用中所声明的应用类型与软件栈中的应用类型不匹配,需要确保两边一致后再进行重试。 403 AppDeleteNotAllowed You cannot delete this application. Make sure that all deployment environments in this application are terminated. 不允许删除该应用,如果该应用下有部署环境,需要确保所有环境均处于“已释放”状态才能删除应用,请检查对应环境的状态后重试。 400 AppMismatch The application specified does not match the application of source object. 指定的部署环境名与源部署环境的模板不属于同一个应用。 400 AppNameUsed The specified application name already exists in this region. Enter another application name. 创建应用时所使用的应用名称已被占用,请更换应用名称后重试。应用名在不同的地域下可重名。 400 AppNotExist A corresponding application was not found based on the application ID. 根据应用ID没有找到对应的应用。 404 AppPackageNotExists An application deployment package is required to create or update a deployment environment. For the first time of using WebPlus, we recommend that you use a sample project. 创建或更新一个部署环境时,请选择正确的应用部署包。当您首次使用Web+时,可以选择示例部署包来体验。 400 AppPackageOwnedByOthers The version of the application package used must be consistent with the application to which the environment belongs. 当创建或更新一个环境的版本信息时,所使用的应用部署包版本必须与环境所属的应用一致。 400 AppPackageOwnedByOthers The version of the deployment package used must be consistent with the application to which the environment belongs. 当创建或更新一个环境的版本信息时,所使用的应用部署包版本必须与环境所属的应用一致。 400 AppUpdateFailed An error occurred while updating application records. The application may have been deleted or the parameters may be invalid. 更新应用记录失败,有可能此应用已经被删除或参数有误。 401 AuthMissingEntityid The specified request object (application, environment, instance, change, software version, or template) ID does not exist. 请求实体(应用/环境/实例/变更/软件版本/模版)的 ID 不存在,请求非法。 401 AuthMissingUid The request is invalid. The primary account AliyunUID does not exist. 主账号ID不存在,请求非法。 400 BadRequest The specified request is invalid. It may contain invalid values, characters, or enumerated values. 请求不合法,可能请求中含有非法的数值、字符、或不符合定义的枚举值等。 404 CategoryNotExists The specified application category does not exist. 根据所使用的应用类型名称没有找到对应的记录,可能是配置错误或参数错误。 400 ChangeActionNameInvalid The specified change name is invalid. Valid values: Apply, RestartApp, StopApp, StartApp, ReloadProxy, Termination, GatherLog, and GatherStats. 变更名称枚举不合法,该枚举的取值范围为:Apply, RestartApp, StopApp, StartApp, ReloadProxy, Termination, GatherLog, GatherStats 。 400 ChangeFinished An error occurred while stopping the change. The change is already complete. 放弃变更失败,因为此次变更已经完成。 404 ChangeNotExists The change record could not be found based on the change ID specified, please double confirm the resource is still exists. 无法根据所指定的变更ID找到变更记录,该记录可能被删除或传入的参数有误。 400 ChangeOnAborting The change is being canceled. Please do not cancel again. 变更正在被中止,请勿重复操作。 400 ChangingAReadonlyConfig An error occurred while modifying the configuration. You cannot modify a read-only configuration. 更新配置失败,您不能对设置为只读的配置进行修改。 400 ConfigExists An error occurred while initializing the environment. The corresponding configuration template already exists. The change is terminated to prevent the existing configuration from being flushed. 初始化环境失败,在初始化环境的配置时,所对应的环境或者模版已经存在相应的配置,为防止覆盖已有的配置,先终止此次变更。 404 ConfigIdxNotExists The configuration index entry does not exist. 配置索引项没有找到。 404 ConfigOptionNotExists An error occurred while updating the configuration. The system did not locate the configuration item declared by the key. 更新配置失败,没能找到对应的Key所声明的配置项。 400 ConfigParamInvalid The request for obtaining the value of configuration index is invalid. Specify either the environment ID or the software stack ID. 获取配置索引的值的请求不合法,环境ID和软件栈ID必须存在一项。 400 ConfigParsingFailed An error occurred while extracting the corresponding item from the configuration. Please check the configuration and try again. 从配置中抽取出对应项时,出现解析参数项的配置;请认真核对配置,修正后重试。 400 ConfigValidationParamInvalid You must specify at least one of the following parameters: software stack ID, template ID, and environment ID. 校验配置失败,软件栈ID、模版ID、环境ID必须存在一项。 400 CreateCommandFailed The creation of the cloud assistant command failed. Please check if the cloud assistant's command exceeds the limit. 创建云助手命令失败,请检查云助手的命令是否超过限制。 404 DefaultVpcNotExists The default VPC in the current Region does not exist. You can manually create a VPC instance on the console and try again. 没有发现该用户对应地域下的默认VPC,您可通过控制台手动创建一个VPC后重试。 404 DefaultVswitchNotExists The default VSwitch is not found under the corresponding VPC. You can manually specify a VSwitch ID or create a new one through the console and try again. 在对应的VPC下,没有发现默认的Vswitch,您可以手动指定Vswitch ID或通过控制台创建Vswitch之后重试。 403 DeleteEnvNotAllowed You cannot delete an environment when the environment is abandoning an update, performing a change, or when the status is not “terminated". 删除应用环境失败,当环境处正在:放弃某次更新、正在执行变更、同时状态不是 "终止"时;不允许删除环境的操作。 404 DeletingEnvNotExists Deleting environment failed. The specified environment does not exist. 删除应用环境失败,将被删除的环境不存在。 400 DiskCategoryInvalid The specified disk category is invalid. 非法的磁盘类别 400 DiskSizeInvalid The specified disk size is invalid. 非法的数据磁盘大小 400 DuplicatedTemplateName An error occurred while generating an environment configuration template. The specified template name already exists in the application. 生成环境配置模版失败,在该应用下,您不能使用已经使用过的模版名称。 400 EcsLaunchTemplateInvalid An error occurred while updating the environment configuration. The start template of the specified ECS instance is not found. 环境配置更新失败,所指定的ECS的启动模版不存在或不可见。 400 EcsTagInalid The specified ECS Tag field is invalid. Please check the key and the value. Values cannot begin with aliyun, http, or https. 非法的ECS Tag,请确认tagKey和tagValue均存在,tagKey和tagValue均不支持aliyun、http://和 https://开头。tagKey不允许为空,tagValue允许为空字符串。 400 EmptyResponse The returned data is empty. 返回数据为空。 400 EnvContainsNoScalingGroup The current deployment environment is not bound to an ESS scaling group ID. This may cause an error when an user attempts to scale up the instance. 当前部署环境没有绑定弹性伸缩服务(ESS)的伸缩组ID,此数据缺失将导致用户实例扩所容的失败。 400 EnvCreateFailed An error occurred while creating an environment. 创建环境失败,在往插入记录时遇到未知错误。 400 EnvDeleteFailed An error occurred while deleting the application environment. This environment may have been deleted, or an error occurred while the server was deleting the environment configuration. 删除应用环境失败,有可能此环境之前已经被删除;或服务器删除环境配置时发生错误。 404 EnvNotExists The corresponding deploy environment was not found according to the env ID. 没有找到对应的应用部署环境,请确认此环境是否被删除或参数是否有误。 404 EnvNotExists The specified deployment environment does not exist. Check whether this environment is deleted or whether the parameter is invalid. 没有找到对应的应用部署环境,请确认此环境是否被删除或参数是否有误。 400 EnvOnChanging An error occurred while starting the change. Wait until the ongoing change is complete. 变更启动失败,原因是上一个变更正在进行,请等待上一次变更完成后再继续。 404 EnvTemplateNotExists When the environment was generated from the template, the corresponding template information was not found; please confirm whether the template was deleted or the parameters passed in were incorrect. 从模版生成环境时,没有发现对应的模版信息;请确认模版是否被删除或传入的参数有误。 401 ESSAuthFailed An error occurred while creating an ESS scaling group. Go to the RAM console and authorize this primary account with the ESS service role. 创建ESS伸缩组失败,您需要前往RAM控制台将ESS服务角色授权至此主账号。 400 EssScalingExecuteFailed An error occurred while scaling the cluster by using ESS. This may have been caused by network jitter. 通过弹性伸缩服务(ESS)进行实例伸缩失败,有可能是网络抖动等其他未知原因引起。 400 GatherLogOnTerminatedEnvNotAllowed It is not allowed to collect logs on an already terminated environment. 不允许在已经终止的环境上收集日志。 403 GatherStatsOnTerminatedEnvNotAllowed You cannot collect system operation statistics on a terminated environment. 不允许在已经终止的环境上收集系统运行统计信息。 400 InstanceIdParamInvalid The specified instance ID does not exist. 实例ID不存在。 404 InstanceNotExists The specified instance does not exist according to the Instance ID declared. The specified instance may have been released or the parameter passed in is invalid. 根据所声明的实例 ID,没有找到对应的实例,有可能所指定的实例已经被释放或参数传入有误。 400 InstanceSizeParamInvalid An error occurred while creating an instance. The number of declared instances must be greater than zero. 创建实例失败,所声明的实例个数必须大于 0。 400 InstanceUpdateInvalidId An error occurred while updating the instance status. The specified instance ID is invalid. 更新实例状态失败,没有找到合法的实例ID。 400 InstanceUpdateStatusFailed An error occurred while updating the data on the database instance. This results in a failure to update the instance status. Please make sure that this instance is still available within the deployed environment. 更新实例状态失败,原因是更新数据库实例数据失败,请确认此实例是否还在此部署环境之中。 500 InternalError An error occurred while creating a configuration template. A database error may have occurred. 配置模版创建失败,此处有可能是数据库发生错误。 500 InternalError An error occurred while creating an application version information record. A database error may have occurred. 应用版本信息记录创建失败,可能为数据库错误。 500 InternalError An error occurred while executing the change. Failed to update the database status for the records of the application environment. 执行变更失败,针对应用环境的记录更新数据库状态失败。 500 InternalError An error occurred while generating a record of changes. This may have been caused by a database error. 变更记录生成失败,此处引起的错误可能是数据库引起。 500 InternalError An error occurred while processing your request. Submit a ticket for a solution Web+网关暂时遇到后端服务短暂的未知错误,这些错误可能由配置、链接、或者后端Bug引起,如果此错误一直出现,请提交工单处理。 500 InternalError An error occurred while updating the application environment. Database entries such as configurations of the application and the environment records may not be updating correctly or they do not exist. 应用环境更新失败,发生此错误信息,有可能是由于应用的配置、环境记录等数据库记录更新有误或不存在。 500 InternalError An error occurred while WebPlus was attempting to insert a record into the database. The application was not created. 创建应用失败,当 WebPlus 试图往数据库中插入记录时失败。 500 InternalError The backend service connection timeout, please try again later. 后端服务地址连接超时,请稍候重试。 500 InternalError The backend service is not reachable, please try again later. 后端服务地址无法联通,请稍候重试。 500 InternalError The backend service resolved failed, the system may under maintenance, please try again later. Web+ 网关发现后端服务地址无法找到,可能系统正在维护;请稍候再重试此动作。 500 InternalError The backend service responded an http error, this request may caused a server error, please try again later. 后端服务返回了 HTTP 错误,请确认参数与操作正确后重试此操作。 400 ListenPortExists A listener with the specified port already exists 所指定的SLB端口已经存在。 400 NameDuplicated The specified name already exists. Please choose a different one. 设置名称已存在,请重设一个名称后继续。 400 NotAGatherLogAction The specified change order is not a change that collects logs. 此变更单ID不是一个收集日志的变更。 400 NotAGatherStatsAction The specified change order is not an order that collects system operational statistics. 此变更单ID不是一个收集系统运行统计信息的变更。 400 OperationFailed An unknown error occurred while processing your request. Please clear the cache or the cookies of your browser. If the problem still exists, please submit a ticket and provide the RequestId. 请求遇到未知错误,如经过清空浏览器缓存/Cookie 等动作重试后依然出现,请提交工单处理,同时请提供 RequestId。 404 OSSBucketNotExists No valid OSS Bucket configuration has been found. It may have been deleted, or the parameter passed in is invalid. 没有发现合法的OSS Bucket配置。有可能Bucket被删除,或传入的参数有误。 400 OSSPathInvalid The specified OSS path is invalid. For more information about OSS path, see oss://webx-demo/directory/file.json 非法的OSS路径,OSS路径请参考:oss://webx-demo/directory/file.json 400 ParameterValidationFailed An error occurred while verifying the parameter. Please confirm whether the value type, size, and range that you passed in for the request are consistent with the declared values. 参数校验失败,请确认请求中的参数传入的值类型、大小、范围等,是否与所声明的一致。 400 PausingFinishedChange An error occurred while pausing a change. You cannot pause a change that has already been completed. 暂停变更失败,您不能针对一个已经完成的变更进行暂停操作。 400 PausingPausedChange An error occurred while pausing a change. You cannot pause a change that has already been paused. 暂停变更失败,您不能针对一个已经暂停的变更进行暂停操作。 403 PermissionDenied Your request is denied. You do not have access to the requested resources. If you are sure that the specified resource belongs to the current primary account, ask the primary account owner to perform a RAM authorization first and try again. 请求拒绝,您对所请求的资源没有发起访问的权限;如确认此资源是属于当前主账号的资源,请联系主账号对此资源进行 RAM 授权后重试此操作。 400 ProfileNameInvalid The specified cluster type in the template is invalid. Valid values: Default, StandAlone, and HighAvailability. 启动模版的集群类型名称不合法,该枚举的取值范围为:Default, StandAlone, HighAvailability. 400 RemoveInstanceParamInvalid An error occurred while releasing an instance. The number of instances to be released need to be greater than zero or the instance ID cannot be empty. 释放实例失败,需要被释放的实例数必须大于 0 或实例 ID 不能为空。 403 ResourceAuthFailed The specified resource does not exist or it does not belong to this Alibaba Cloud account. 相关资源不存在或不属于此阿里云账号。 400 ResumingANotPausedChange An error occurred while restarting a change. You cannot restart a change that is not paused. 重启变更失败,您不能针对一个没有暂停的变更进行重启操作。 400 ResumingFinishedChange An error occurred while restarting a change. You cannot restart a change that has already been completed. 重启变更失败,您不能针对一个已经完成的变更进行重启操作。 404 ScalingGroupNotExists An error occurred while obtaining the scaling group rule of the Auto Scaling service (ESS). The scaling group may have been deleted or the parameters may be invalid. 获取弹性伸缩服务(ESS)伸缩组规则失败,有可能此伸缩组被删除或参数有误。 404 SecurityGroupNotExists An error occurred while updating the environment configuration. The specified security group does not exist. 环境配置更新失败,所指定的安全组不存在。 400 SecurityGroupVpcNotMatch An error occurred while updating the environment configuration. The VPC in which the specified security group is located does not match the VPC in which the instance is located. 环境配置更新失败,所指定的安全组所在的 VPC 与实例所在的 VPC 不匹配。 400 SlbRuleInvalid The SLB forwarding rule does not permit an empty domain name with a root path of /. SLB 转发规则不允许域名为空,同时路径为根路径(/)。 404 SourceEnvNotExists The source environment information does not exist while cloning from a deployment environment. Please check whether the environment is deleted or with wrong parameter. 克隆环境时,发现源环境信息不存在,请确认是否被删除或传入的参数有误。 404 SourceTemplateNotExists An error occurred while building an environment, because the declared template ID does not exist. 从模版生成环境失败,原因是所声明的模版ID不存在 400 StackContainsNoConfigOption An error occurred while modifying the configuration. The corresponding software stack does not contain any configuration items. 配置变更失败,对应的软件栈不包含任何的配置项。 404 StackNotExists The declared software stack information does not exist. 创建应用或更新应用环境时,所声明的软件栈信息不存在。 400 StartMovingFailed An error occurred while executing a change. Update failed when calculating the configurations and resources. 开始执行变更失败,当进入到资源规则匹配的计算时,后台出现更新失败。 403 StatusNotAllowedRebuild You can only rebuild a terminated environment or an environment that failed to be rebuilt. 应用环境重建只能针对两种状态进行:已终止或上次执行失败。其他状态不允许重建的操作。 403 StatusNotAllowedRestart Only a running environment or a terminated environment can be restarted. 应用环境重启只能针对两种状态进行:运行中或停止;其他状态不允许重启操作 403 StatusNotAllowedStart A start action can only be made to an environment that is already stopped. An environment with other status cannot be started. 应用启动只能针对已经停止的应用环境状态进行,其他状态不允许启动。 403 StatusNotAllowedStop A stop action can only be made to an environment that is already running. An environment with other status cannot be stopped. 应用停止只能针对已经在运行中的环境状态进行,其他状态不允许应用停止。 403 StatusNotAllowedTerminated A terminate action cannot be performed on an environment that has already terminated. 不能对已经终止的环境执行应用终止操作。 404 TemplateNotExists An error occurred while updating the configuration. No corresponding configuration template instance was found. 更新配置失败,没有找到相应的配置模版实例。 401 TenantInvalid The system did not find a username based on AliyunUID. 根据Aliyunuid没有获取到用户名。 400 VersionLabelExists An error occurred while creating an application version. The version name already exists. Please use a different name and try again. 创建应用版本失败,版本名称已经存在,请更换版本名称后重试此次操作。 403 VpcNotAllowedUpdate You are not allowed to modify the VPC ID against an unterminated environment. Please terminate it before continuing this operation. 未终止的环境不允许修改VPC ID,请先终止环境后再继续此项操作。 404 VPCNotExists An error occurred while changing the environment configuration. The specified VPC instance does not exist according to the specified VPC ID. 变更环境配置失败,根据所指定的VPC ID没有查询得到相应的VPC实例。 404 VSwitchNotExists An error occurred while changing the environment configuration. The specified VSwitch does not exist according to the specified VSwitch ID. 变更环境配置失败,根据所指定的VSwitch ID没有查询得到指定的VSwitch实例。 访问错误中心查看更多错误码。 访问错误中心查看更多错误码。
1934890530796658 2020-03-23 14:44:34 0 浏览量 回答数 0

问题

MySQL的前缀索引及Oracle的类似实现

MySQL有一个很有意思的索引类型,叫做前缀索引,它可以给某个文本字段的前面部分单独做索引,从而降低索引的大小。 其实, Oracle也有类似的实现,对于文本࿰...
驻云科技 2019-12-01 21:34:28 3465 浏览量 回答数 2

问题

阿里音乐流行趋势预测大赛一起做-(6)小结

由于论坛发帖限制,链接和图片内容见CSDN博客 阿里音乐流行趋势预测大赛一起做-(6)小结 部分内容如下: 最近一直在忙毕业的事情,比赛也落下不少。今天第一次切换了数...
sixgod 2019-12-01 21:46:15 8580 浏览量 回答数 11

回答

有多种方法可以从数据库的多个表中检索数据。在此答案中,我将使用ANSI-92连接语法。这可能与其他使用较旧的ANSI-89语法的其他教程有所不同(如果您习惯使用89,可能看起来不那么直观-但我只能说尝试一下),因为它更容易了解查询何时开始变得更复杂。为什么要使用它?有性能提升吗?在简短的回答是否定的,但它是更易于阅读,一旦你习惯了它。使用此语法更容易读取其他人编写的查询。 我还将使用小型堆场的概念,该堆场具有一个数据库来跟踪其可用的汽车。所有者已将您雇用为他的IT计算机人员,并希望您能够一口气就把他要求的数据丢给他。 我制作了许多最终表将使用的查找表。这将为我们提供一个合理的工作模型。首先,我将对具有以下结构的示例数据库运行查询。我将尝试思考刚开始时所犯的常见错误,并解释错误的根源-以及当然会显示如何纠正错误。 第一张桌子只是一个颜色列表,以便我们知道车场中的颜色。 mysql> create table colors(id int(3) not null auto_increment primary key, -> color varchar(15), paint varchar(10)); Query OK, 0 rows affected (0.01 sec) mysql> show columns from colors; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(3) | NO | PRI | NULL | auto_increment | | color | varchar(15) | YES | | NULL | | | paint | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> insert into colors (color, paint) values ('Red', 'Metallic'), -> ('Green', 'Gloss'), ('Blue', 'Metallic'), -> ('White' 'Gloss'), ('Black' 'Gloss'); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select * from colors; +----+-------+----------+ | id | color | paint | +----+-------+----------+ | 1 | Red | Metallic | | 2 | Green | Gloss | | 3 | Blue | Metallic | | 4 | White | Gloss | | 5 | Black | Gloss | +----+-------+----------+ 5 rows in set (0.00 sec) 品牌表标识了车库外可能出售的汽车的不同品牌。 mysql> create table brands (id int(3) not null auto_increment primary key, -> brand varchar(15)); Query OK, 0 rows affected (0.01 sec) mysql> show columns from brands; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(3) | NO | PRI | NULL | auto_increment | | brand | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.01 sec) mysql> insert into brands (brand) values ('Ford'), ('Toyota'), -> ('Nissan'), ('Smart'), ('BMW'); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select * from brands; +----+--------+ | id | brand | +----+--------+ | 1 | Ford | | 2 | Toyota | | 3 | Nissan | | 4 | Smart | | 5 | BMW | +----+--------+ 5 rows in set (0.00 sec) 模型表将涵盖不同类型的汽车,使用不同类型的汽车而不是实际的汽车模型会更简单。 mysql> create table models (id int(3) not null auto_increment primary key, -> model varchar(15)); Query OK, 0 rows affected (0.01 sec) mysql> show columns from models; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(3) | NO | PRI | NULL | auto_increment | | model | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> insert into models (model) values ('Sports'), ('Sedan'), ('4WD'), ('Luxury'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from models; +----+--------+ | id | model | +----+--------+ | 1 | Sports | | 2 | Sedan | | 3 | 4WD | | 4 | Luxury | +----+--------+ 4 rows in set (0.00 sec) 最后,要捆绑所有其他表,该表将所有内容捆绑在一起。ID字段实际上是用于识别汽车的唯一批号。 mysql> create table cars (id int(3) not null auto_increment primary key, -> color int(3), brand int(3), model int(3)); Query OK, 0 rows affected (0.01 sec) mysql> show columns from cars; +-------+--------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+----------------+ | id | int(3) | NO | PRI | NULL | auto_increment | | color | int(3) | YES | | NULL | | | brand | int(3) | YES | | NULL | | | model | int(3) | YES | | NULL | | +-------+--------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql> insert into cars (color, brand, model) values (1,2,1), (3,1,2), (5,3,1), -> (4,4,2), (2,2,3), (3,5,4), (4,1,3), (2,2,1), (5,2,3), (4,5,1); Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> select * from cars; +----+-------+-------+-------+ | id | color | brand | model | +----+-------+-------+-------+ | 1 | 1 | 2 | 1 | | 2 | 3 | 1 | 2 | | 3 | 5 | 3 | 1 | | 4 | 4 | 4 | 2 | | 5 | 2 | 2 | 3 | | 6 | 3 | 5 | 4 | | 7 | 4 | 1 | 3 | | 8 | 2 | 2 | 1 | | 9 | 5 | 2 | 3 | | 10 | 4 | 5 | 1 | +----+-------+-------+-------+ 10 rows in set (0.00 sec) 这将为我们提供足够的数据(我希望),以掩盖下面不同类型的联接的示例,并提供足够的数据以使它们值得。 因此,老板想了解这个问题,老板想知道他拥有的所有跑车的ID。 这是一个简单的两张表联接。我们有一个表,用于标识模型以及具有可用库存的表。正如你所看到的,在数据model的列cars表涉及models的列cars,我们有表。现在,我们知道models表的ID为1for,Sports因此让我们编写联接。 select ID, model from cars join models on model=ID 所以这个查询看起来不错吧?我们已经识别了两个表并包含我们需要的信息,并使用一个联接来正确识别要联接的列。 ERROR 1052 (23000): Column 'ID' in field list is ambiguous 哦,不!我们的第一个查询有错误!是的,它是一个李子。您会看到,查询确实有正确的列,但是两个表中都存在一些列,因此数据库对于实际的含义和位置感到困惑。有两种解决方案可以解决此问题。第一个很简单,我们可以用来tableName.columnName准确地告诉数据库我们的意思,就像这样: select cars.ID, models.model from cars join models on cars.model=models.ID +----+--------+ | ID | model | +----+--------+ | 1 | Sports | | 3 | Sports | | 8 | Sports | | 10 | Sports | | 2 | Sedan | | 4 | Sedan | | 5 | 4WD | | 7 | 4WD | | 9 | 4WD | | 6 | Luxury | +----+--------+ 10 rows in set (0.00 sec) 另一个可能更常用,称为表别名。该示例中的表具有简单易用的简单名称,但是键入类似的名称KPI_DAILY_SALES_BY_DEPARTMENT可能很快就会变老,因此一种简单的方法是对表进行昵称,如下所示: select a.ID, b.model from cars a join models b on a.model=b.ID 现在,返回到请求。如您所见,我们拥有所需的信息,但我们也有未要求提供的信息,因此我们需要在语句中包含where子句,以便仅按要求获取跑车。由于我更喜欢​​表别名方法,而不是一遍又一遍地使用表名,因此从现在开始,我将坚持使用它。 显然,我们需要在查询中添加where子句。我们可以通过ID=1或识别跑车model='Sports'。由于ID已被索引并且主键(而且恰好键入的次数较少),因此请在查询中使用它。 select a.ID, b.model from cars a join models b on a.model=b.ID where b.ID=1 +----+--------+ | ID | model | +----+--------+ | 1 | Sports | | 3 | Sports | | 8 | Sports | | 10 | Sports | +----+--------+ 4 rows in set (0.00 sec) 答对了!老板很高兴。当然,作为老板,对自己的要求从不满意,他会查看信息,然后说我也要颜色。 好的,因此我们已经编写了很大一部分查询,但是我们需要使用第三个表颜色。现在,我们的主要信息表cars存储了汽车颜色ID,该链接返回到颜色ID列。因此,以与原始表类似的方式,我们可以连接第三个表: select a.ID, b.model from cars a join models b on a.model=b.ID join colors c on a.color=c.ID where b.ID=1 +----+--------+ | ID | model | +----+--------+ | 1 | Sports | | 3 | Sports | | 8 | Sports | | 10 | Sports | +----+--------+ 4 rows in set (0.00 sec) 该死,尽管表已正确连接并且相关列已链接,但我们忘记从刚链接的新表中提取实际信息。 select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID where b.ID=1 +----+--------+-------+ | ID | model | color | +----+--------+-------+ | 1 | Sports | Red | | 8 | Sports | Green | | 10 | Sports | White | | 3 | Sports | Black | +----+--------+-------+ 4 rows in set (0.00 sec) 是的,那是我们的老板暂时离开了。现在,更详细地解释其中的一些。如您所见,from语句中的子句链接了我们的主表(我经常使用一个包含信息的表,而不是查找表或维度表。该查询在所有被切换的表中也能正常工作,但是当我们会在几个月后回到此查询中进行阅读,因此通常最好尝试编写一个简单易懂的查询-直观地进行排列,使用漂亮的缩进以使所有内容都清晰易懂如果您继续教别人,请尝试在他们的查询中灌输这些特征-尤其是要对它们进行故障排除时。 完全有可能以此方式链接越来越多的表。 select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=1 虽然我忘记在表中包含一个我们可能希望在其中联接多个列的join表,但这里有一个示例。如果该models表具有特定于品牌的模型,因此也有一个称为的列brand,该列链接回brands该ID字段中的表,则可以这样进行: select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID and b.brand=d.ID where b.ID=1 您可以看到,上面的查询不仅将联接表链接到主cars表,而且还指定了已联接表之间的联接。如果不这样做,结果称为笛卡尔联接-dba不好。笛卡尔联接是返回行的联接,因为该信息不会告诉数据库如何限制结果,因此查询将返回所有符合条件的行。 因此,举一个笛卡尔联接的例子,让我们运行以下查询: select a.ID, b.model from cars a join models b +----+--------+ | ID | model | +----+--------+ | 1 | Sports | | 1 | Sedan | | 1 | 4WD | | 1 | Luxury | | 2 | Sports | | 2 | Sedan | | 2 | 4WD | | 2 | Luxury | | 3 | Sports | | 3 | Sedan | | 3 | 4WD | | 3 | Luxury | | 4 | Sports | | 4 | Sedan | | 4 | 4WD | | 4 | Luxury | | 5 | Sports | | 5 | Sedan | | 5 | 4WD | | 5 | Luxury | | 6 | Sports | | 6 | Sedan | | 6 | 4WD | | 6 | Luxury | | 7 | Sports | | 7 | Sedan | | 7 | 4WD | | 7 | Luxury | | 8 | Sports | | 8 | Sedan | | 8 | 4WD | | 8 | Luxury | | 9 | Sports | | 9 | Sedan | | 9 | 4WD | | 9 | Luxury | | 10 | Sports | | 10 | Sedan | | 10 | 4WD | | 10 | Luxury | +----+--------+ 40 rows in set (0.00 sec) 天哪,这很丑。但是,就数据库而言,正是所要求的。在查询中,我们要求IDfrom cars和modelfrom models。但是,因为我们没有指定如何联接表,数据库匹配了每一个从第一表行与每一从第二表行。 好的,老板回来了,他希望再次提供更多信息。我想要相同的列表,但还要包含4WD。 但是,这为我们提供了一个很好的借口来研究实现此目的的两种不同方法。我们可以向where子句添加另一个条件,如下所示: select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=1 or b.ID=3 尽管上面的方法可以很好地工作,但是让我们以不同的方式来看待它,这是一个很好的借口来说明union查询将如何工作。 我们知道以下将返回所有跑车: select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=1 以下将返回所有的四轮驱动车: select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=3 因此,通过union all在它们之间添加子句,第二个查询的结果将附加到第一个查询的结果。 select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=1 union all select a.ID, b.model, c.color from cars a join models b on a.model=b.ID join colors c on a.color=c.ID join brands d on a.brand=d.ID where b.ID=3 +----+--------+-------+ | ID | model | color | +----+--------+-------+ | 1 | Sports | Red | | 8 | Sports | Green | | 10 | Sports | White | | 3 | Sports | Black | | 5 | 4WD | Green | | 7 | 4WD | White | | 9 | 4WD | Black | +----+--------+-------+ 7 rows in set (0.00 sec) 如您所见,首先返回第一个查询的结果,然后返回第二个查询的结果。 在此示例中,简单地使用第一个查询当然会容易得多,但是union查询在特定情况下可能会很好。它们是从不容易连接在一起的表中返回表中特定结果的好方法-或完全无关的表。但是,有一些规则要遵循。 来自第一个查询的列类型必须与下面的每个其他查询的列类型匹配。 第一个查询中的列名称将用于标识整个结果集。 每个查询中的列数必须相同。 现在,您可能想知道使用union和之间有什么区别union all。一个union查询将删除重复,而union all不会。这确实意味着使用union过度时性能会受到较小的影响,union all但结果可能是值得的-尽管我不会在这种情况下进行推测。 关于此注释,在这里可能需要注意一些其他注释。 如果要订购结果,可以使用an,order by但不能再使用别名。在上面的查询中,附加an order by a.ID将导致错误-就结果而言,该列将被调用,ID而不是a.ID-即使两个查询都使用了相同的别名。 我们只能有一个order by声明,并且必须作为最后一个声明。 对于下一个示例,我将向表中添加一些额外的行。 我已添加Holden到品牌表。我还添加了一行,到cars具有color的价值12-它在颜色表中没有提及。 好的,老板又回来了,咆哮着请求-*我想统计一下我们经营的每个品牌以及其中的汽车数量!`-典型的,我们只是进入了一个有趣的讨论部分,老板希望做更多的工作。 Rightyo,所以我们要做的第一件事就是完整列出所有可能的品牌。 select a.brand from brands a +--------+ | brand | +--------+ | Ford | | Toyota | | Nissan | | Smart | | BMW | | Holden | +--------+ 6 rows in set (0.00 sec) 现在,当我们将其连接到汽车表时,将得到以下结果: select a.brand from brands a join cars b on a.ID=b.brand group by a.brand +--------+ | brand | +--------+ | BMW | | Ford | | Nissan | | Smart | | Toyota | +--------+ 5 rows in set (0.00 sec) 这当然是个问题-我们没有提到Holden我添加的可爱品牌。 这是因为联接在两个表中都查找匹配的行。由于汽车中没有任何类型的数据,Holden因此不会返回。这是我们可以使用outer联接的地方。这将返回一个表中的所有结果,无论它们是否与另一表中的结果匹配: select a.brand from brands a left outer join cars b on a.ID=b.brand group by a.brand +--------+ | brand | +--------+ | BMW | | Ford | | Holden | | Nissan | | Smart | | Toyota | +--------+ 6 rows in set (0.00 sec) 现在,有了这个功能,我们可以添加一个可爱的聚合函数来获得计数,并让老板暂时离开。 select a.brand, count(b.id) as countOfBrand from brands a left outer join cars b on a.ID=b.brand group by a.brand +--------+--------------+ | brand | countOfBrand | +--------+--------------+ | BMW | 2 | | Ford | 2 | | Holden | 0 | | Nissan | 1 | | Smart | 1 | | Toyota | 5 | +--------+--------------+ 6 rows in set (0.00 sec) 这样一来,老板就走了。 现在,为了更详细地说明这一点,外部联接可以是left或right类型。左或右定义完全包含哪个表。A left outer join将包括左侧表中的所有行,而(您猜对了)a right outer join将右侧表中的所有结果带入结果中。 某些数据库允许使用a full outer join,这将从两个表中带回结果(无论是否匹配),但是并非所有数据库都支持。 现在,我可能想知道此时,您想知道是否可以在查询中合并联接类型-答案是肯定的,您绝对可以。 select b.brand, c.color, count(a.id) as countOfBrand from cars a right outer join brands b on b.ID=a.brand join colors c on a.color=c.ID group by a.brand, c.color +--------+-------+--------------+ | brand | color | countOfBrand | +--------+-------+--------------+ | Ford | Blue | 1 | | Ford | White | 1 | | Toyota | Black | 1 | | Toyota | Green | 2 | | Toyota | Red | 1 | | Nissan | Black | 1 | | Smart | White | 1 | | BMW | Blue | 1 | | BMW | White | 1 | +--------+-------+--------------+ 9 rows in set (0.00 sec) 那么,为什么不是预期的结果呢?这是因为尽管我们选择了从汽车到品牌的外部联接,但未在颜色联接中指定-因此特定联接只会带回在两个表中都匹配的结果。 这是可以获取我们期望的结果的查询: select a.brand, c.color, count(b.id) as countOfBrand from brands a left outer join cars b on a.ID=b.brand left outer join colors c on b.color=c.ID group by a.brand, c.color +--------+-------+--------------+ | brand | color | countOfBrand | +--------+-------+--------------+ | BMW | Blue | 1 | | BMW | White | 1 | | Ford | Blue | 1 | | Ford | White | 1 | | Holden | NULL | 0 | | Nissan | Black | 1 | | Smart | White | 1 | | Toyota | NULL | 1 | | Toyota | Black | 1 | | Toyota | Green | 2 | | Toyota | Red | 1 | +--------+-------+--------------+ 11 rows in set (0.00 sec) 如我们所见,查询中有两个外部联接,结果按预期进行。 现在,您问这些其他类型的联接如何?那路口呢? 好吧,并非所有数据库都支持,intersection但是几乎所有数据库都将允许您通过联接(或至少结构良好的where语句)创建交集。 Intersection是一种连接类型,与union上述的连接有点类似-但区别在于,它仅返回由联合连接的各个单个查询之间相同(并且我的意思是相同)的数据行。仅返回在各方面相同的行。 一个简单的例子是这样的: select * from colors where ID>2 intersect select * from colors where id<4 虽然普通union查询将返回表的所有行(第一个查询返回,ID>2而第二个返回具有ID<4)将形成一个完整的集合,但相交查询将仅返回id=3符合两个条件的行。 现在,如果您的数据库不支持intersect查询,则可以通过以下查询轻松完成以上操作: select a.ID, a.color, a.paint from colors a join colors b on a.ID=b.ID where a.ID>2 and b.ID<4 +----+-------+----------+ | ID | color | paint | +----+-------+----------+ | 3 | Blue | Metallic | +----+-------+----------+ 1 row in set (0.00 sec) 如果希望使用本身不支持交集查询的数据库在两个不同的表之间执行交集,则需要在表的每一列上创建一个联接。
保持可爱mmm 2020-05-08 11:31:28 0 浏览量 回答数 0

回答

*1、查询SQL尽量不要使用select ,而是select具体字段。 反例子: select * from employee; 正例子: select id,name from employee; 理由: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。 2、如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 假设现在有employee员工表,要找出一个名字叫jay的人. CREATE TABLE `employee` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `date` datetime DEFAULT NULL, `sex` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 反例: select id,name from employee where name='jay' 正例 select id,name from employee where name='jay' limit 1; 理由: 加上limit 1后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。当然,如果name是唯一索引的话,是不必要加上limit 1了,因为limit的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有limit ,性能的差别并不大。 3、应尽量避免在where子句中使用or来连接条件 新建一个user表,它有一个普通索引userId,表结构如下: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `age` int(11) NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_userId` (`userId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 假设现在需要查询userid为1或者年龄为18岁的用户,很容易有以下sql 反例: select * from user where userid=1 or age =18 正例: //使用union all select * from user where userid=1 union all select * from user where age = 18 //或者分开两条sql写: select * from user where userid=1 select * from user where age = 18 理由: 使用or可能会使索引失效,从而全表扫描。 对于or+没有索引的age这种情况,假设它走了userId的索引,但是走到age查询条件时,它还得全表扫描,也就是需要三步过程: 全表扫描+索引扫描+合并 如果它一开始就走全表扫描,直接一遍扫描就完事。 mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引可能失效,看起来也合情合理。 4、优化limit分页 我们日常做分页需求时,一般会用 limit 实现,但是当偏移量特别大的时候,查询效率就变得低下。 反例: select id,name,age from employee limit 10000,10 正例: //方案一 :返回上次查询的最大记录(偏移量) select id,name from employee where id>10000 limit 10. //方案二:order by + 索引 select id,name from employee order by id limit 10000,10 //方案三:在业务允许的情况下限制页数: 理由: 当偏移量最大的时候,查询效率就会越低,因为Mysql并非是跳过偏移量直接去取后面的数据,而是先把偏移量+要取的条数,然后再把前面偏移量这一段的数据抛弃掉再返回的。 如果使用优化方案一,返回上次最大查询记录(偏移量),这样可以跳过偏移量,效率提升不少。 方案二使用order by+索引,也是可以提高查询效率的。 方案三的话,建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。 5、优化你的like语句 日常开发中,如果用到模糊关键字查询,很容易想到like,但是like很可能让你的索引失效。 反例: select userId,name from user where userId like '%123'; 正例: select userId,name from user where userId like '123%'; 理由: 把%放前面,并不走索引,如下: 把% 放关键字后面,还是会走索引的。如下: 6、使用where条件限定要查询的数据,避免返回多余的行 假设业务场景是这样:查询某个用户是否是会员。曾经看过老的实现代码是这样。。。 反例: List<Long> userIds = sqlMap.queryList("select userId from user where isVip=1"); boolean isVip = userIds.contains(userId); 正例: Long userId = sqlMap.queryObject("select userId from user where userId='userId' and isVip='1' ") boolean isVip = userId!=null; 理由: 需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销。 7、尽量避免在索引列上使用mysql的内置函数 业务需求:查询最近七天内登陆过的用户(假设loginTime加了索引) 反例: select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now(); 正例: explain select userId,loginTime from loginuser where loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY); 理由: 索引列上使用mysql的内置函数,索引失效 8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫 反例: select * from user where age-1 =10; 正例: select * from user where age =11; 理由: 9、Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小 Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集 left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。 right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。 都满足SQL需求的前提下,推荐优先使用Inner join(内连接),如果要使用left join,左边表数据结果尽量小,如果有条件的尽量放到左边处理。 反例: select * from tab1 t1 left join tab2 t2 on t1.size = t2.size where t1.id>2; 正例: select * from (select * from tab1 where id >2) t1 left join tab2 t2 on t1.size = t2.size; 理由: 如果inner join是等值连接,或许返回的行数比较少,所以性能相对会好一点。 同理,使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。 10、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 反例: select age,name from user where age <>18; 正例: //可以考虑分开两条sql写 select age,name from user where age <18; select age,name from user where age >18; 理由: 使用!=和<>很可能会让索引失效 11、使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则。 表结构:(有一个联合索引idx_userid_age,userId在前,age在后) CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `age` int(11) DEFAULT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_userid_age` (`userId`,`age`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 反例: select * from user where age = 10; 正例: //符合最左匹配原则 select * from user where userid=10 and age =10; //符合最左匹配原则 select * from user where userid =10; 理由: 当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。 联合索引不满足最左原则,索引一般会失效,但是这个还跟Mysql优化器有关的。 12、对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描。 反例: select * from user where address ='深圳' order by age ; 正例: 添加索引 alter table user add index idx_address_age (address,age) 13、如果插入数据过多,考虑批量插入。 反例: for(User u :list){ INSERT into user(name,age) values(#name#,#age#) } 正例: //一次500批量插入,分批进行 insert into user(name,age) values <foreach collection="list" item="item" index="index" separator=","> (#{item.name},#{item.age}) </foreach> 理由: 批量插入性能好,更加省时间 打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500),你可以选择一次运送一块砖,也可以一次运送500,你觉得哪个时间消耗大? 14、在适当的时候,使用覆盖索引。 覆盖索引能够使得你的SQL语句不需要回表,仅仅访问索引就能够得到所有需要的数据,大大提高了查询效率。 反例: // like模糊查询,不走索引了 select * from user where userid like '%123%' 正例: //id为主键,那么为普通索引,即覆盖索引登场了。 select id,name from user where userid like '%123%'; 15、慎用distinct关键字 distinct 关键字一般用来过滤重复记录,以返回不重复的记录。在查询一个字段或者很少字段的情况下使用时,给查询带来优化效果。但是在字段很多的时候使用,却会大大降低查询效率。 反例: SELECT DISTINCT * from user; 正例: select DISTINCT name from user; 理由: 带distinct的语句cpu时间和占用时间都高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较,过滤的过程会占用系统资源,cpu时间。 16、删除冗余和重复索引 反例: KEY `idx_userId` (`userId`) KEY `idx_userId_age` (`userId`,`age`) 正例: //删除userId索引,因为组合索引(A,B)相当于创建了(A)和(A,B)索引 KEY `idx_userId_age` (`userId`,`age`) 理由: 重复的索引需要维护,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能的。 17、如果数据量较大,优化你的修改/删除语句。 避免同时修改或删除过多数据,因为会造成cpu利用率过高,从而影响别人对数据库的访问。 反例: //一次删除10万或者100万+? delete from user where id <100000; //或者采用单一循环操作,效率低,时间漫长 for(User user:list){ delete from user; } 正例: //分批进行删除,如每次500 delete user where id<500 delete product where id>=500 and id<1000; 理由: 一次性删除太多数据,可能会有lock wait timeout exceed的错误,所以建议分批操作。 18、where子句中考虑使用默认值代替null。 反例: select * from user where age is not null; 正例: //设置0为默认值 select * from user where age>0; 理由: 并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关。 如果mysql优化器发现,走索引比不走索引成本还要高,肯定会放弃索引,这些条件!=,>is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃的。 如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思会相对清晰一点。 19、不要有超过5个以上的表连接 连表越多,编译的时间和开销也就越大。 把连接表拆开成较小的几个执行,可读性更高。 如果一定需要连接很多表才能得到数据,那么意味着糟糕的设计了。 20、exist & in的合理利用 假设表A表示某企业的员工表,表B表示部门表,查询所有部门的所有员工,很容易有以下SQL: select * from A where deptId in (select deptId from B); 这样写等价于: 先查询部门表B select deptId from B 再由部门deptId,查询A的员工 select * from A where A.deptId = B.deptId 可以抽象成这样的一个循环: List<> resultSet ; for(int i=0;i<B.length;i++) { for(int j=0;j<A.length;j++) { if(A[i].id==B[j].id) { resultSet.add(A[i]); break; } } } 显然,除了使用in,我们也可以用exists实现一样的查询功能,如下: select * from A where exists (select 1 from B where A.deptId = B.deptId); 因为exists查询的理解就是,先执行主查询,获得数据后,再放到子查询中做条件验证,根据验证结果(true或者false),来决定主查询的数据结果是否得意保留。 那么,这样写就等价于: select * from A,先从A表做循环 select * from B where A.deptId = B.deptId,再从B表做循环. 同理,可以抽象成这样一个循环: List<> resultSet ; for(int i=0;i<A.length;i++) { for(int j=0;j<B.length;j++) { if(A[i].deptId==B[j].deptId) { resultSet.add(A[i]); break; } } } 数据库最费劲的就是跟程序链接释放。假设链接了两次,每次做上百万次的数据集查询,查完就走,这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,这样系统就受不了了。即mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。 因此,我们要选择最外层循环小的,也就是,如果B的数据量小于A,适合使用in,如果B的数据量大于A,即适合选择exist。 21、尽量用 union all 替换 union 如果检索结果中不会有重复的记录,推荐union all 替换 union。 反例: select * from user where userid=1 union select * from user where age = 10 正例: select * from user where userid=1 union all select * from user where age = 10 理由: 如果使用union,不管检索结果有没有重复,都会尝试进行合并,然后在输出最终结果前进行排序。如果已知检索结果没有重复记录,使用union all 代替union,这样会提高效率。 22、索引不宜太多,一般5个以内。 索引并不是越多越好,索引虽然提高了查询的效率,但是也降低了插入和更新的效率。 insert或update时有可能会重建索引,所以建索引需要慎重考虑,视具体情况来定。 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否没有存在的必要。 23、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型 反例: king_id` varchar(20) NOT NULL COMMENT '守护者Id' 正例: `king_id` int(11) NOT NULL COMMENT '守护者Id'` 理由: 相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销。 24、索引不适合建在有大量重复数据的字段上,如性别这类型数据库字段。 因为SQL优化器是根据表中数据量来进行查询优化的,如果索引列有大量重复数据,Mysql查询优化器推算发现不走索引的成本更低,很可能就放弃索引了。 25、尽量避免向客户端返回过多数据量。 假设业务需求是,用户请求查看自己最近一年观看过的直播数据。 反例: //一次性查询所有数据回来 select * from LivingInfo where watchId =useId and watchTime >= Date_sub(now(),Interval 1 Y) 正例: //分页查询 select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit offset,pageSize //如果是前端分页,可以先查询前两百条记录,因为一般用户应该也不会往下翻太多页, select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit 200 ; 26、当在SQL语句中连接多个表时,请使用表的别名,并把别名前缀于每一列上,这样语义更加清晰。 反例: select * from A inner join B on A.deptId = B.deptId; 正例: select memeber.name,deptment.deptName from A member inner join B deptment on member.deptId = deptment.deptId; 27、尽可能使用varchar/nvarchar 代替 char/nchar。 反例: `deptName` char(100) DEFAULT NULL COMMENT '部门名称' 正例: `deptName` varchar(100) DEFAULT NULL COMMENT '部门名称' 理由: 因为首先变长字段存储空间小,可以节省存储空间。 其次对于查询来说,在一个相对较小的字段内搜索,效率更高。 28、为了提高group by 语句的效率,可以在执行到该语句前,把不需要的记录过滤掉。 反例: select job,avg(salary) from employee group by job having job ='president' or job = 'managent' 正例: select job,avg(salary) from employee where job ='president' or job = 'managent' group by job; 29、如何字段类型是字符串,where时一定用引号括起来,否则索引失效 反例: select * from user where userid =123; 正例: select * from user where userid ='123'; 理由: 为什么第一条语句未加单引号就不走索引了呢? 这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。 30、使用explain 分析你SQL的计划 日常开发写SQL的时候,尽量养成一个习惯吧。用explain分析一下你写的SQL,尤其是走不走索引这一块。 explain select * from user where userid =10086 or age =18;
剑曼红尘 2020-04-21 14:01:32 0 浏览量 回答数 0

回答

---数据库版本 select * from v$version ---SCOTT默认表空间以及用户 select u.username,u.default_tablespace from dba_users u where u.username='SCOTT' select * from database_properties dp where dp.property_name='DEFAULT_PERMANENT_TABLESPACE'; select u.username,u.default_tablespace from dba_users u where u.username='dborcl' select * from dba_tablespaces ---1.首先,创建(新)用户: create user gaohao identified by gaohao; --也可以不创建新用户,而仍然用以前的用户,如:继续利用scott用户 ---2.创建表空间: create tablespace ZTTM datafile 'd:\oracle\data.dbf' size 500M; ---3.将空间分配给用户: alter user gaohao default tablespace ZTTM; ---将名字为tablespacename的表空间分配给username ---4.给用户授权: grant create session,create table,unlimited tablespace to gaohao; ---5.然后再以楼主自己创建的用户登录,登录之后创建表即可。 create user ZTTM identified by zttm; alter user ZTTM default tablespace ZTTM; grant create session,create table,unlimited tablespace to ZTTM; ---建表 create table UserInfo ( USERID int primary key , UNAME varchar(20) not null, ISMARRAY char(5) not null, ISONJOB char(5) not null, REMARK varchar(500) null ) insert into UserInfo values(1,'Tom','0','0','*****************************'); insert into UserInfo values(2,'JACK','1','0','JJJJJJJJJJJJJJJJJJJJJJJJJ'); insert into UserInfo values(3,'JIM','0','1','WWWWWWWWWWWWWWW'); insert into UserInfo values(4,'BOT','1','1','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); insert into UserInfo values(5,'KATE','1','0','GGGGGGGGGGGGGGGGGGGGGGGG'); insert into UserInfo values(6,'BRAN','0','1','HHHHHHHHHHHHHHHHHHHHHHHHHHHHH'); insert into UserInfo values(7,'JUN','1','1','RRRRRRRRRRRRRRRRRRRRRRRRRRR'); insert into UserInfo values(8,'ANDRUE','1','1','EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE'); insert into UserInfo values(9,'ALICE','1','0','VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'); insert into UserInfo values(10,'HANKS','0','1','QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ'); insert into UserInfo values(11,'KEBE','0','1','BNNNNNNNNNNNNNNNNNNNNNNNN'); insert into UserInfo values(12,'SAM','1','0','ZXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); insert into UserInfo values(13,'BOB','0','0','TTTTTTTTTTTTTTTTTTTTTTTTTTTT'); select * from UserInfo; select to_date('20120725115536','yyyy-MM-dd HH24:mi:ss') TimeStamp from dual grant select on v_$statname to gaohao; grant select on v_$session to gaohao; grant select on v_$sesstat to gaohao; grant select on v_$mystat to gaohao; grant select on v_$statname to ZTTM; grant select on v_$session to ZTTM; grant select on v_$sesstat to ZTTM; grant select on v_$mystat to ZTTM; select u.USERID,--员工编号 u.UNAME, --员工姓名 u.ISMARRAY, --婚否 u.ISONJOB,--是否在职 u.REMARK --备注 from UserInfo u where u.USERID like '%1%' select to_char(to_date('20120727094755','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') CurrentTime from dual select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') CurrentTime from dual; select TO_DATE(null) from dual; /SQL语句/ select * from log_cpuidle where idle_date = (select to_char(sysdate-1,'DD-MON-YY') from dual); /*其中idle_date是DATE类型的,不知道为啥要将sysdate进行转换,只有这样才能查找到日期是前一天的数据; 其中要注意的是sysdate对应的格式为DD-MON-YY;*/ insert into table select a, b, count()c,avg(d),e from LOG_TABLE where a=(select to_char(sysdate-1, 'DD-MON-YY') from dual) group by a, b, e order by b; / 复合型的insert 语句; 取前几行的数据用rownum;select * from table where rownum < 10; group by:分组查询,一般和聚合函数(AVG、SUM、MAX、COUNT等)一起使用,它后面可以跟having限制性语句; order by:select “栏位名” from “表格”[where “条件”] order by “栏位名”[asc, desc]*/ •/============创建Customer表==========/ •create table Customer •( • Customer_id number(6) not null, • Customer_name varchar2(50) not null, • Password varchar2(20) not null, • True_name varchar2(20), • Email_address varchar2(50) not null, --唯一 • Password_question varchar2(50) not null, • Password_anwser varchar2(50) not null, • Status char(1), --默认是1,取值0或1 • Customer_level char(1), --默认是1,取值1,2,3 • Score number(6), • Register_date date, --默认为系统时间 • Login_time timestamp, • Login_count number(6), • Login_ip char(6) •); •/===========创建Orders表==========/ •create table Orders •( • Order_id varchar2(10) not null, • Order_Customer_id number(6) not null, • Order_date date not null, • Order_price number not null •); •/==========查询Customer表===========/ •select * from Customer • •/==========向表中添加数据===========/ •insert into Customer values •(220077,'wantingqiang','wtq','万廷强','lovezhqj@qq.com','你是哪个?','wtq','1','3',150,sysdate,sysdate,15789,'172.26') • •/==========修改表Customer===========/ •alter table Customer •modify Login_ip char(16); • •/=========修改第一条记录中的ip=====/ •update Customer set Login_ip='172.26.3.145' where Customer_id='220077';--ip地址修改成功 • •/=========添加一个列===============/ •alter table Customer •add LoginOut_time date; --新列增加成功 • •/=========删除一个列LoginOut_time========/ •alter table Customer •drop column LoginOut_time; --列删除成功 • •/========给列添加注释===========/ •comment on column • Customer.Customer_Name is '客户姓名'; • •/========给表添加注释==========/ •comment on table Customer is '客户表,为了保持与客户的联系'; • •/========重新命名表============/ •alter table Customer rename to Customer_Change; • •select * from Customer_Change • •alter table Customer_Change rename to Customer; • •/==========添加非空约束========/ •alter table Customer •modify status not null; --非空约束添加成功 • •/==========添加主键约束========/ •alter table Customer •add constraint customer_id_pk primary key(Customer_id); --主键添加成功 • •/==========添加外键约束========/ •--向Orders表中添加外键,与Customer表关联 •--在下面的列子末尾加上: •--on delete 表示允许级联删除 •--on update 表示允许级联更新 •alter table Orders •add constraint Orders_Customer_fk foreign key(Order_Customer_id) references Customer(Customer_id); •--外键添加成功 •/==========删除外键约束=========/ •alter table Orders •drop constraint "ORDERS_CUSTOMER_FK"; --外键删除成功,这个要注意大小写哈 • •/=========添加唯一约束========/ •alter table Customer •add constraint un_email unique(Email_address); --添加唯一约束成功 • • •/=========修改默认约束========/ •alter table Customer •modify Status default('1'); • •/=========添加检查约束========/ •alter table Customer •add constraint ck_status check(Status in ('1','0')); --检查约束添加成功 • • •/==========禁止检查约束=======/ •alter table Customer • disable constraint ck_status; --禁止成功 • •/==========激活检查约束=======/ •alter table Customer • enable constraint ck_status; --激活成功 • •/==========删除检查约束========/ •alter table Customer •drop constraint ck_status; --删除检查约束成功 • •/==========最后是删除表========/ •drop table Customer; --删除表成功 /使用SQLPLUS(1) SQL> desc table; 显示表结构 SQL> select * from tab; 查看用户下所有的表 SQL> set pause on; 可以使大量结果集在用户按“Enter”(回车)后翻页 SQL> set pagesize 100; 设定SQL语句返回结果集一页的行数100, 默认值是14 SQL> set linesize 100; 设定SQL语句返回结果集一行的宽度100, 默认值是80*/ /*常用的日期处理函数 oracle内部以数字格式存储日期和时间信息:世纪,年,月,日,小时,分钟,秒 临时表dual表 缺省格式:DD-MON-YY('14-3月-08') round(to_date('14-3月-08'),'month') 可使用sysdate函数(没有参数和括号)获取当前系统日期和时间 日期数据直接加或减一个数值(不一定是整数,代表的是多少天),结果仍为日期(约定的单位为天,当然也可以为月或年) 两个日期数据可以相减(不可相加,没有意义 ),结果为二者相差多少天 add_months(日期x,数值y):计算在日期x基础上增加y个月后的日期 add_months(sysdate,2) last_day(s) 返回日期x当月最后一天的日期 last_day(sysdate) months_between(x,y) 返回日期x和y之间相差的月数 months_between(sysdate,sysdate) 有正负号之分(参数前后关系有关) round(x,y) 四舍五入将日期x截断到y所指定的日期单位(月或年)的第一天 round(sysdate,'month') 3月14号为3月1号 3月16号为4月1号 年的同理round(sysdate,'year') trunc(x,y) 将日期x截断到y所指定的日期单位(月或年)的第一天,不四舍五入trunc(sysdate,'month')trunc(sysdate,'year') next_day(x,y) 计算指定日期x后的第一个星期几(由参数y指定)对应的日期 next_day(sysdate,'星期二')*/ select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月 select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日 select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时 select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分 select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒 select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; /设置两个日期之间的天数;/ select count(*)from ( select rownum-1 rnum from all_objects where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-02-01','yyyy-mm-dd')+1 ) where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in ( '1', '7' ) select TO_CHAR(SYSDATE,'DDD'),sysdate from dual /显示今天是一年中的第几天;/ /计算时间差 注:oracle时间差是以天数为单位,所以换算成年月,日 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual // 时间差-年 select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //时间差-月 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //时 间差-天 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))24) as spanHours from dual // 时间差-时 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))2460) as spanMinutes from dual //时间差-分 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))246060) as spanSeconds from dual //时间差-秒/ /TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:007 yyyy four digits 四位年 显示值:2007 Month: mm number 两位月 显示值:11 mon abbreviated 字符集表示 显示值:11月,若是英文版,显示nov month spelled out 字符集表示 显示值:11月,若是英文版,显示november Day: dd number 当月第几天 显示值:02 ddd number 当年第几天 显示值:02 dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写 显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth/ /日期的比较/ /在今天之前:/ select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update <= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') /在今天只后:/ select * from up_date where update > to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update >= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') /精确时间:/ select * from up_date where update = to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') /在某段时间内:/ select * from up_date where update between to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and update > to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update <= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and update >= to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss') /日期时间间隔操作/   /*当前时间减去7分钟的时间 */  select sysdate,sysdate - interval '7' MINUTE from dual /*当前时间减去7小时的时间 */  select sysdate - interval '7' hour from dual /*当前时间减去7天的时间 */  select sysdate - interval '7' day from dual /当前时间减去7月的时间/ select sysdate,sysdate - interval '7' month from dual /当前时间减去7年的时间/ select sysdate,sysdate - interval '7' year from dual /时间间隔乘以一个数字/ select sysdate,sysdate - 8 *interval '2' hour from dual /返回当前时间 年月日小时分秒毫秒/   select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') from dual; --返回当前 时间的秒毫秒,可以指定秒后面的精度(最大=9)   select to_char(current_timestamp(9),'MI:SSxFF') from dual; /Oracle SQL 语句对时间操作的总结/ /在SQL语句中,常常用会对时间(或日期)进行一些处理,下面是比较通用的一些语句: 延迟: sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟5小时 sysdate+5 在系统时间基础上延迟5天 add_months(sysdate,-5) 在系统时间基础上延迟5月 add_months(sysdate,-512) 在系统时间基础上延迟5年 */ /上月末的日期:/ select last_day(add_months(sysdate, -1)) from dual; /本月的最后一秒:/ select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual /本周星期一的日期:/ select trunc(sysdate,'day')+1 from dual /年初至今的天数:/ select ceil(sysdate - trunc(sysdate, 'year')) from dual; /今天是今年的第几周 :/ select to_char(sysdate,'fmww') from dual /今天是本月的第几周:/ SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual /本月的天数/ SELECT to_char(last_day(SYSDATE),'dd') days FROM dual /今年的天数/ select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual /下个星期一的日期/ SELECT Next_day(trunc(SYSDATE),'monday') FROM dual ================================ /计算工作日方法/ create table t(s date,e date); alter session set nls_date_format = 'yyyy-mm-dd'; insert into t values('2003-03-01','2003-03-03'); insert into t values('2003-03-02','2003-03-03'); insert into t values('2003-03-07','2003-03-08'); insert into t values('2003-03-07','2003-03-09'); insert into t values('2003-03-05','2003-03-07'); insert into t values('2003-02-01','2003-03-31'); -- 这里假定日期都是不带时间的,否则在所有日期前加trunc即可。 select s,e,e-s+1 total_days, trunc((e-s+1)/7)*5 + length(replace(substr('01111100111110',to_char(s,'d'),mod(e-s+1,7)),'0','')) work_days from t; -- drop table t; ======================================================== /判断当前时间是上午下午还是晚上/ SELECT CASE WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN '上午' WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN '下午' WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN '晚上' END FROM dual; ========================================================== /Oracle 中的一些处理日期/ /将数字转换为任意时间格式.如秒:需要转换为天/小时/ SELECT to_char(floor(TRUNC(936000/(6060))/24))||'天'||to_char(mod(TRUNC(936000/(6060)),24))||'小时' FROM DUAL TO_DATE格式 /*Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal twelfth Month: mm number 03 mon abbreviated mar month spelled out march Year: yy two digits 98 yyyy four digits 1998 24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 日期和字符转换函数 用法(to_date,to_char) */ 2. select to_char( to_date(222,'J'),'Jsp') from dual /*显示Two Hundred Twenty-Two */ /*3. 求某天是星期几 */ select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; /设置日期语言/ ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; /*也可以这样 */ TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') /*4. 两个日期间的天数 */ select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; /*5. 时间为null的用法 */ select id, active_date from table1 UNION select 1, TO_DATE(null) from dual; /注意要用TO_DATE(null)/ /*6. a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 所以,当时间需要精确的时候,觉得to_char还是必要的 日期格式冲突问题 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' */ alter system set NLS_DATE_LANGUAGE = American alter session set NLS_DATE_LANGUAGE = American /*或者在to_date中写 */ select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; /注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看/ select * from nls_session_parameters select * from V$NLS_PARAMETERS 8. select count(*) from ( select rownum-1 rnum from all_objects where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 02-01','yyyy-mm-dd')+1 ) where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in ( '1', '7' ) /*查找2002-02-28至2002-02-01间除星期一和七的天数 在前后分别调用DBMS_UTILITY.GET_TIME, 然后将结果相减(得到的是1/100秒, 而不是毫秒). */ 9. select months_between(to_date('01-31-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1 select months_between(to_date('02-01-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1.03225806451613 /*10. Next_day的用法 Next_day(date, day) */ /*Monday-Sunday, for format code DAY Mon-Sun, for format code DY 1-7, for format code D */ 11 select to_char(sysdate,'hh:mi:ss') TIME from all_objects /*注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题 */ create or replace function sys_date return date is begin return sysdate; end; select to_char(sys_date,'hh:mi:ss') from all_objects; /*12. 获得小时数 */ SQL> select sysdate ,to_char(sysdate,'hh') from dual; SYSDATE TO_CHAR(SYSDATE,'HH') 2003-10-13 19:35:21 07 SQL> select sysdate ,to_char(sysdate,'hh24') from dual; SYSDATE TO_CHAR(SYSDATE,'HH24') 2003-10-13 19:35:21 19 /*获取年月日与此类似 */ /*13. 年月日的处理 / select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years12+months ) ) ) days from ( select trunc(months_between( newer_date, older_date )/12) YEARS, mod(trunc(months_between( newer_date, older_date )), 12 ) MONTHS, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date from emp ) ) /*14. 处理月份天数不定的办法 */ select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual /*16. 找出今年的天数 */ select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual /*闰年的处理方法 */ to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) /*如果是28就不是闰年 */ /*17. yyyy与rrrr的区别 / /'YYYY99 TO_C yyyy 99 0099 rrrr 99 1999 yyyy 01 0001 rrrr 01 2001 18.不同时区的处理 */ select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate from dual; /*19. 5秒钟一个间隔 */ Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual TO_DATE(FL TO_CH 2007-01-01 60368 /*SSSSS表示5位秒数 */ /*20. 一年的第几天 */ select TO_CHAR(SYSDATE,'DDD'),sysdate from dual TO_ SYSDATE 017 2007-01-17 /21.计算小时,分,秒,毫秒 / select Days, A, TRUNC(A24) Hours, TRUNC(A2460 - 60TRUNC(A24)) Minutes, TRUNC(A246060 - 60TRUNC(A2460)) Seconds, TRUNC(A246060100 - 100TRUNC(A2460*60)) mSeconds from ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual ) select * from tabname order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); /*// floor((date2-date1) /365) 作为年 floor((date2-date1, 365) /30) 作为月 mod(mod(date2-date1, 365), 30) 作为日. */ /*22.next_day函数 */ /*next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 1 2 3 4 5 6 7 日 一 二 三 四 五 六 */ select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))2460*60 from dual /*日期 返回的是天 然后 转换为ss */ select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))2460 from dual ; select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24 from dual ; select (sysdate-to_date('2012-07-23 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24 from dual ; select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))2460*60 from dual ; Oracle中TO_DATE格式 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:007 yyyy four digits 四位年 显示值:2007 Month: mm number 两位月 显示值:11 mon abbreviated 字符集表示 显示值:11月,若是英文版,显示nov month spelled out 字符集表示 显示值:11月,若是英文版,显示november Day: dd number 当月第几天 显示值:02 ddd number 当年第几天 显示值:02 dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写 显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制 显示值:01 hh24 two digits 24小时进制 显示值:13 Minute: mi two digits 60进制 显示值:45 Second: ss two digits 60进制 显示值:25 其它 Q digit 季度 显示值:4 WW digit 当年第几周 显示值:44 W digit 当月第几周 显示值:1 24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月 select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日 select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时 select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分 select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒 select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual// select to_char( to_date(222,'J'),'Jsp') from dual 显示Two Hundred Twenty-Two 3.求某天是星期几 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 星期一 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; monday 设置日期语言 ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 也可以这样 TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 两个日期间的天数 select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; 时间为null的用法 select id, active_date from table1 UNION select 1, TO_DATE(null) from dual; 注意要用TO_DATE(null) 6.月份差 a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 所以,当时间需要精确的时候,觉得to_char还是必要的 日期格式冲突问题 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter system set NLS_DATE_LANGUAGE = American alter session set NLS_DATE_LANGUAGE = American 或者在to_date中写 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看 select * from nls_session_parameters select * from V$NLS_PARAMETERS select count(*) from ( select rownum-1 rnum from all_objects where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 02-01','yyyy-mm-dd')+1 ) where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in ( '1', '7' ) 查找2002-02-28至2002-02-01间除星期一和七的天数 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). 查找月份 select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1 select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1.03225806451613 Next_day的用法 Next_day(date, day) Monday-Sunday, for format code DAY Mon-Sun, for format code DY 1-7, for format code D 11 select to_char(sysdate,'hh:mi:ss') TIME from all_objects 注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题 create or replace function sys_date return date is begin return sysdate; end; select to_char(sys_date,'hh:mi:ss') from all_objects; 12.获得小时数 extract()找出日期或间隔值的字段值 SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer SQL> select sysdate ,to_char(sysdate,'hh') from dual; SYSDATE TO_CHAR(SYSDATE,'HH') -------------------- --------------------- 2003-10-13 19:35:21 07 SQL> select sysdate ,to_char(sysdate,'hh24') from dual; SYSDATE TO_CHAR(SYSDATE,'HH24') -------------------- ----------------------- 2003-10-13 19:35:21 19 13.年月日的处理 select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years*12+months ) ) ) days from ( select trunc(months_between( newer_date, older_date )/12) YEARS, mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date from emp ) ) 14.处理月份天数不定的办法 select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual 16.找出今年的天数 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 闰年的处理方法 to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) 如果是28就不是闰年 17.yyyy与rrrr的区别 'YYYY99 TO_C yyyy 99 0099 rrrr 99 1999 yyyy 01 0001 rrrr 01 2001 18.不同时区的处理 select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate from dual; 19.5秒钟一个间隔 Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual 2002-11-1 9:55:00 35786 SSSSS表示5位秒数 20.一年的第几天 select TO_CHAR(SYSDATE,'DDD'),sysdate from dual 310 2002-11-6 10:03:51 21.计算小时,分,秒,毫秒 select Days, A, TRUNC(A24) Hours, TRUNC(A2460 - 60TRUNC(A24)) Minutes, TRUNC(A246060 - 60TRUNC(A2460)) Seconds, TRUNC(A246060100 - 100TRUNC(A2460*60)) mSeconds from ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual ) select * from tabname order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); // floor((date2-date1) /365) 作为年 floor((date2-date1, 365) /30) 作为月 d(mod(date2-date1, 365), 30)作为日. 23.next_day函数 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日 next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 1 2 3 4 5 6 7 日 一 二 三 四 五 六 select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))2460*60 from ddual 日期 返回的是天 然后 转换为ss 24,round舍入到最接近的日期 select sysdate S1, round(sysdate) S2 , round(sysdate,'year') YEAR, round(sysdate,'month') MONTH , round(sysdate,'day') DAY from dual 25,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型 select sysdate S1, trunc(sysdate) S2, //返回当前日期,无时分秒 trunc(sysdate,'year') YEAR, //返回当前年的1月1日,无时分秒 trunc(sysdate,'month') MONTH , //返回当前月的1日,无时分秒 trunc(sysdate,'day') DAY //返回当前星期的星期天,无时分秒 from dual 26,返回日期列表中最晚日期 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual 27.计算时间差 注:oracle时间差是以天数为单位,所以换算成年月,日 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //时间差-年 select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //时间差-月 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //时间差-天 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //时间差-时 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //时间差-分 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //时间差-秒 28.更新时间 注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-年 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改变时间-月 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-时 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-分 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-秒 29.查找月的第一天,最后一天 SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month, Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month, Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month, LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month FROM dual;
保持可爱mmm 2020-04-15 23:33:10 0 浏览量 回答数 0

回答

执行伸缩活动时,可能因一些原因导致异常,无法成功完成。本文列出了常见的控制台说明信息,并给出原因和解决建议。 背景信息 伸缩活动异常包括伸缩活动被拒绝和伸缩活动执行失败,您可以参考查看伸缩活动了解相关的状态信息或详细信息。 伸缩活动被拒绝 如果伸缩活动被拒绝,您可以从状态信息了解原因,并采取对应的解决方案,如下表所示: 伸缩活动状态信息 原因及建议 DBInstanceIdentifier does not refer to an existing DB instance.(xxxx) 原因:RDS实例不存在。 建议:请确保伸缩组关联的RDS实例已存在。 The current status of the load balancer xxxxx does not support this action. 原因:负载均衡实例状态不是active。 建议:请确保伸缩组关联的负载均衡实例处于正常工作的状态。 To execute the specified scaling rule, the total capacity will not change. 原因:伸缩组内的实例数不能小于伸缩组设置的最小值,也不能大于伸缩组设置的最大值,执行此伸缩规则将导致伸缩组内实例小于最小值或大于最大值,因此拒绝执行。 建议:请检查目前实例数量或伸缩规则配置,确保执行伸缩规则后不会超出实例数量限制。 The current status of DB instance xxxxx does not support this action. 原因:RDS实例状态异常,暂不支持执行伸缩活动。 建议:如果伸缩组关联的RDS实例处于迁移状态,建议登录RDS控制台确认实例状态处于正常工作状态,然后重新执行伸缩活动。 You cannot delete a scaling group or launch a new scaling activity while there is scaling activity in progress for the specified scaling group. 原因:当前伸缩组有正在执行的伸缩活动。 建议:请等待当前的伸缩活动运行完成,然后执行新的伸缩活动。 You cannot launch a new scaling activity during the cooldown period. 原因:伸缩组处于冷却时间,伸缩活动被拒绝执行。 建议:需要等待冷却时间结束,具体说明请参考冷却时间。 The current status of the specified scaling group does not support this action. 原因:当期伸缩组状态不支持此操作,伸缩组可能为停用状态或者删除中状态。 建议:如果伸缩组为停用状态,请先启用伸缩组。 The specified SecurityGroupId does not exist. 原因:伸缩配置对应的安全组不存在。 建议:请修改伸缩配置,设置对应的安全组。 To remove the instances, the total capacity will be lesser than the min size. 原因:伸缩组内的实例数不能小于伸缩组设置的最小值,如果移除伸缩组内现有的实例,会导致伸缩组内实例数小于伸缩组最小值,因此被拒绝执行。 建议:请检查目前实例数量或伸缩规则配置,确保执行伸缩规则后不会超出实例数量限制。 The specified LoadBalancerId does not exist. 原因:负载均衡实例不存在。 建议:请确保伸缩组关联的负载均衡实例已存在,伸缩组中设置负载均衡实例详情可参考在弹性伸缩中使用负载均衡服务。 Ess should be authorized in ram to operate user resource. 原因:主账号未授权当前子账号操作弹性伸缩服务相关资源。 建议:请登录访问控制控制台授权相关资源,然后继续操作。 To attach the instances, the total capacity will be greater than the max size. 原因:伸缩组内的实例数不能大于伸缩组设置的最大值,如果添加实例到伸缩组,会导致伸缩组内实例数大于伸缩组最大值,因此被拒绝执行。 建议:请检查目前实例数量或伸缩规则配置,确保执行伸缩规则后不会超出实例数量限制。 The current status of virtual switch does not support this operation. 原因:虚拟交换机(Vswitch)的状态为pending或modifying,伸缩组暂时无法执行伸缩活动。 建议:请检查伸缩组关联的虚拟交换机的状态,确保处于可用状态,然后重试。 The specified virtual switch does not exist. 原因:虚拟交换机不存在。 建议:请确保伸缩组关联的虚拟交换机未被删除。 The specified launch template set is not found. 原因:实例启动模板不存在。 建议:请登录ECS控制台,确保伸缩组关联的实例启动模板已存在,然后重新设置伸缩组关联的实例启动模板。 Instance "xxxxx" and the specified scaling group are not in the same VPC. 原因:当前ECS实例所属的专有网络(VPC)与伸缩组对应的专有网络不一致。 建议:请确保专有网络伸缩组内的ECS实例与伸缩组属于同一个专有网络,或者ECS实例网络类型为经典网络。 The specified virtual switch and the instance in Load Balancer "xxxxx" are not in the same VPC. 原因:负载均衡实例与虚拟交换机(Vswitch)所属的专有网络(VPC)不一致。 建议:请确保Vswitch和负载均衡实例处于同一个专有网络下,负载均衡实例的添加限制请参考在弹性伸缩中使用负载均衡服务。 Instance "xxxx" is already attached to another scaling group. 原因:ECS实例只能添加到一个伸缩组,不能同时属于多个伸缩组。 建议:请确保待添加的ECS实例没有加入到其它伸缩组。 The specified image does not exist. 原因:镜像不存在。 建议:请检查伸缩配置,确保镜像可用。 DataDiskSnapshotId "xxxx" does not exist. 原因:数据盘快照不存在。 建议:请检查伸缩配置,确保数据盘的快照可用。 伸缩活动执行失败 如果伸缩活动执行失败,您可以从详细信息了解原因,并采取对应的解决方案,如下表所示: 伸缩活动详细信息 原因及建议 Fail to scale instances for scaling group("Ignore to remove N instances("instances in standby/protected status")"). 原因:指定实例处于备用/实例保护状态。 建议:请手动移除或释放实例。 说明 具体说明请参考实例保护和实例备用。 Fail to remove Instances "i-xxx1, i-xxx2"("The current status of the specified scaling group does not support this action."). 原因:当前伸缩组状态不支持移除实例操作。 建议:请确保伸缩组状态为生效。移除实例相关限制请参考官方文档RemoveInstances。 Fail to create Instances into scaling group("The specified InstanceType has been offline."). 原因:指定实例规格已下线。 建议:请在伸缩配置中选择在售的实例规格,更多说明请参考实例规格族汇总。 Fail to create Instances into scaling group("The specified ImageId does not exist."). 原因:伸缩配置指定镜像ID不存在。 建议:请检查伸缩配置,确认指定镜像可用,或者重新选择可用的镜像。 Fail to create Instances into scaling group("Your account has been in arrears."). 原因:您的账户已欠费。 建议:请保证账户额度充足,您可以在费用中心查看账户费用信息。 Fail to create Instances into scaling group("Your account does not have enough balance."). 原因:您的账户可用额度不足。 建议:请保证账户额度充足,您可以在费用中心查看账户费用信息。 Fail to create Instances into scaling group("Your account has not passed the real-name authentication yet."). 原因:您的账户尚未通过实名认证。 建议:请开启实名认证。 Fail to create Instances into scaling group("The specified parameter "spotPriceLimit" can't be lower than current public price."). 原因:指定抢占式实例的每小时最高价格低于当前市场价格。 建议:请检查伸缩配置,重新设置抢占式实例出价或者出价策略,确保满足创建抢占式实例的条件。更多信息请参考抢占式实例。 Fail to create Instances into scaling group("Living afterpay instances quota exceeded."). 原因:您持有的按量付费实例已超过限额。 建议:请联系客服或提交工单申请提高按量付费实例限额。 Fail to create Instances into scaling group("The specified parameter "KeyPairName" does not exist in our records."). 原因:伸缩配置中指定密钥对不存在。 建议:请检查伸缩配置,确保当前密钥对可用,或者重新设置密钥对。 Fail to create Instances into scaling group("The specified parameter 'SystemDisk.Category' is not support IoOptimized Instance. Valid Values: cloud_efficiency;cloud_ssd. "). 原因:当前系统盘类型不支持IO优化实例。 建议:请检查伸缩配置,修改系统盘类型,建议值: 高效云盘(cloud_efficiency) SSD云盘(cloud_ssd) Fail to create Instances into scaling group("The resource is out of stock in the specified zone. Please try other types, or choose other regions and zones."). 原因:指定资源库存不足。 建议:请检查伸缩配置和伸缩组信息,视情况选择其他实例规格或者可用区。 Fail to create Instances into scaling group("The RAM user does not have the privilege to pass a RAM role."). 原因:伸缩配置中指定RAM角色不存在。 建议:请检查伸缩配置,重新指定合法RAM角色。 Fail to create Instances into scaling group("No payment method has been registered on the account."). 原因:当前账户未设置默认支付方式。 建议:请前往账号中心设置默认支付方式。 Fail to create Instances into scaling group("Exceeding the allowed amount of instances of a security group."). 原因:指定安全组下的实例数量超过上限。 建议:请检查当前伸缩组,尝试将单个伸缩组扩展成多个伸缩组,并分别关联不同的安全组,以满足横向扩容的需要。 Fail to create Instance into scaling group("The current status of instance "pending" does not support this action."). 原因:当前实例状态不支持指定操作。 建议:请检查确实例状态,确保为Running后重试。 Fail to create Instances into scaling group("Abandon lifecycleActionResult parameter caused the instance to rollback."). 原因:伸缩组配置了扩容(ScaleOut)类型的生命周期挂钩(LifecycleHook),当伸缩组扩容时,生命周期挂钩被触发,并且生命周期挂钩最终的执行结果为拒绝,导致扩容伸缩活动回滚,扩容出来的 ECS 实例被释放。 建议:请检查生命周期挂钩的执行策略。 说明 更多生命周期挂钩的信息,请参考创建生命周期挂钩。 Fail to create instance into scaling group("The specified SecurityGroupId is invalid or does not exist.") 原因:安全组不存在。 建议:请检查伸缩配置,重新指定已存在的安全组。 Fail to create instance into scaling group("The specified ImageId does not exist.") 原因:镜像不存在。 建议:请检查伸缩配置,重新指定已存在的镜像。 Fail to create instance into scaling group("Your account has been in arrears.") 原因:您的账户可用额度不足。 建议:请保证账户额度充足。 Fail to scale instances for scaling group("Backend server quota exceeded in load balancer "lb-xxxxxxx"."). 原因:负载均衡实例的后端服务器组下可挂载ECS实例配额超出限制。 建议:请调整后端服务器的配额。更多说明请参考使用限制和管理配额。 Fail to create Instances into scaling group("The specified imageName does not exist."). 原因:镜像名称不存在。 建议:请检查伸缩配置,重新指定已存在的镜像。 Fail to create Instances into scaling group("This resource type is not supported. Please try other resource types."). 原因:可用区下无指定的资源类型。 建议:建议在伸缩组中设置多可用区,并在伸缩配置中设置多实例规格,提高扩容成功率。更多说明请参考使用自定义伸缩配置创建伸缩组和创建伸缩配置。 Fail to create Instances into scaling group("The specified parameter SnapshotId is not exist."). 原因:磁盘快照不存在。 建议:请检查伸缩配置,重新指定已存在的磁盘快照。 Fail to create Instances into scaling group("Don't have enough private IPs in this switch"). 原因:虚拟交换机没有足够的私网IP。 建议:请检查伸缩配置关联的虚拟交换机,调大虚拟交换机可用私网IP数量,或者在伸缩组配置中设置多可用区。更多说明请参考使用自定义伸缩配置创建伸缩组。 Fail to create Instances into scaling group("The specified parameter SystemDisk.Size is less than the image size."). 原因:系统盘容量小于镜像文件大小。 建议:请检查伸缩配置,增大系统盘容量或者使用占用空间更小的镜像。 Fail to create Instances into scaling group("Living postPaid disks quota exceeded."). 原因:当前账号下现存的按量付费磁盘限额超过限制。 建议:请联系客服或提交工单申请调整配额。 Fail to create Instances into scaling group("The specified ram role is not authorized for ecs, please check your role policy."). 原因:弹性伸缩服务对应的RAM角色AliyunEssDefaultRole没有包括ECS接口权限。 建议:请重新授权。 说明 具体操作请参考AutoScaling授权指南。 Fail to create instance into scaling group("The resource in the specified zone is no longer available for sale. Please try other regions and zones.") 原因:实例规格在指定可用区下已停止售卖。 建议:请检查伸缩组设置,建议设置多可用区。更多说明请参考使用自定义伸缩配置创建伸缩组。 Fail to create instance into scaling group("The resource is out of stock in the specified zone. Please try other types, or choose other regions and zones.") 原因:实例规格在指定可用区下已停止售卖。 建议:建议在伸缩组中设置多可用区,并在伸缩配置中设置多实例规格,提高扩容成功率。更多说明请参考使用自定义伸缩配置创建伸缩组和创建伸缩配置。 Fail to create instance into scaling group("The specified parameter "KeyPairName" only support IoOptimized Instance.") 原因:实例规格为非I/O的优化实例规格,非I/O优化实例不支持密钥对。 建议:请检查伸缩配置,调整伸缩配置实例规格为I/O优化实例规格,或者删除KeyPair参数。 Fail to create instance into scaling group("A RAM role can't be used for classic instance.") 原因:经典网络类型实例不支持RAM角色。 建议:请检查伸缩组的网络类型,建议您修改伸缩组网络类型为专有网络,或者移除伸缩配置中的RamRoleName参数。 Fail to create instance into scaling group("The specified parameter "RAMRoleName" does not exist.") 原因:RAMRoleName不存在。 建议:请登录访问控制控制台检查当前RAM角色是否存在,或者指定其它RAM角色。 Fail to create instance into scaling group("The specified image does not support the specified InstanceType.") 原因:镜像与实例规格不匹配。 建议:请登录ECS售卖页查看实例规格支持的镜像,然后重新调整伸缩配置。 Fail to create instance into scaling group("The requested resource is sold out in the specified zone; try other types of resources or other regions and zones.") 原因:实例规格在伸缩组对应的可用区下库存不足。 建议:建议在伸缩组中设置多可用区,并在伸缩配置中设置多实例规格,提高扩容成功率。更多说明请参考使用自定义伸缩配置创建伸缩组和创建伸缩配置。
1934890530796658 2020-03-23 09:43:35 0 浏览量 回答数 0
阿里云企业服务平台 陈四清的老板信息查询 上海奇点人才服务相关的云产品 爱迪商标注册信息 安徽华轩堂药业的公司信息查询 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 天籁阁商标注册信息 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 北京芙蓉天下的公司信息查询