精华内容
下载资源
问答
  • 唯一是表什么的
    千次阅读
    2022-04-26 10:46:13

    平时业务量比较大,一张HIVE表里面的字段也比较多,如何判断所select 的这几个字段是这张表的唯一主键,也就是,选取这几个主键,可以唯一确定只有一行数据
    可以通过,select A,B,C from table group by A,B,C HAVING COUNT(1)>=2
    通过上面这句sql查询出根据ABC三个字段分组的数据其中每组有2条以上的组共有哪些,如果查出来的话有出现数据,就说明存在该分组有两条以上的数据,那么说明A,B,C不是主键,无法确认这张表里面一条唯一的数据,如果查询出来的是没有数据,那么就说明A,B,C是唯一主键,因为不存在以A,B,C为分组且条数有2条以上的数据,它只有一条数据,也就是唯一一行。

    更多相关内容
  • 数据库的主键、唯一约束和索引

    千次阅读 2021-11-23 17:31:46
    1、MySQL 的 主键。...(2)主键值必须唯一标识中的每一行,且不能为 NULL,即同一个中不可能存在两行数据有相同的主键值。 2、MySQL 的 唯一约束。  MySQL唯一约束(Unique Key)是指所有记录中字

    目录

    1、MySQL的主键。

    2、MySQL的唯一约束。

    3、MySQL的索引。

    4、主键、唯一约束和唯一索引的区别。

    1、MySQL 的 主键。

      "主键" 的完整称呼是 "主键约束" 。MySQL 主键约束是一个列或者列的组合(其中由多列组合的主键称为复合主键),其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。。

    (1)一个表可以没有主键,而且最多只能有一个主键。

    (2)主键值必须唯一标识表中的每一行,且不能为 NULL,即同一个表中不可能存在两行数据有相同的主键值。

    2、MySQL 的 唯一约束。

      MySQL唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为 "0001" ,那么该表中就不能出现另一条记录的 id 值也为 "0001" 。

      唯一约束可以确保一列或者几列不出现重复值。

      唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是最多只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

      唯一约束可以在创建表时直接设置,通常设置在除了主键以外的其它列上。

      在定义列的尾部直接使用 UNIQUE 关键字指定唯一约束,语法格式如:<字段名> <数据类型> UNIQUE 。( 或者 UNIQUE KEY `unique_name` (`first_name`, `last_name`)

      在修改表时添加唯一约束的语法格式为:ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>); 。

      在 MySQL 中删除唯一约束的语法格式如下:ALTER TABLE <表名> DROP INDEX <唯一约束名>; 。

      如果业务中要求两个字段联合起了是唯一的,比如 "地址" + "名称" 是唯一的,这就需要对两列甚至多列添加联合唯一约束。

    3、MySQL 的 索引。

      为什么要使用索引?

      索引是 MySQL 中一种十分重要的数据库对象。它是数据库性能调优技术的基础,常用于实现数据的快速检索。

      索引是什么?

      首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录。

      索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一一对应关系的有序表。

      例如,若对表中name字段建立索引,则按照表中name字段进行索引排序,并为其建立指向数据表中记录所在位置的 "指针"

      查询方式有两种,其中一种是全表扫描;另一种是利用数据表上建立的索引进行扫描。

      在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

    (1) 顺序访问

    顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。这种方式实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

    (2) 索引访问

    索引访问是通过遍历索引来直接访问表中记录行的方式。使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。

      例如,在学生基本信息表 students 中,如果基于 student_id 建立了索引,系统就建立了一张索引列到实际记录的映射表,当用户需要查找 student_id 为 12022 的数据的时候,系统先在 student_id 索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。

      索引根据用途分为:

    (1)普通索引:是最基本的索引类型,它的目的是加快对数据的访问速度,没有任何限制。索引列值可以取空值或重复值。创建使用关键字 "INDEX" "KEY"

    (2)唯一索引:是不允许具有相同索引值的索引。创建唯一索引的目的往往不是为了提高访问速度,而是为了避免数据出现重复。其中索引列值不能重复,即索引列值必须是唯一的。创建使用关键字 "UNIQUE"

    (3)主键索引:是唯一索引的特定类型。索引值不能为空值。主键是用来唯一标识表中一条记录的。主键不允许为空值,主键是唯一的。一个表只能有一个主键,不可能有多个主键。创建使用关键字 "PRIMARY KEY"

    注意:唯一索引和主键索引不是互斥关系;唯一索引包含了主键索引;主键索引是一种特殊的唯一索引。

      索引根据列数分为:

    (1)单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这些单列索引不是组合索引。比如,创建一个学号ID的索引;以name再创建一个姓名的单列索引。

    (2)组合索引(复合索引或多列索引):即一个索引包含多个列。比如,以用户ID、用户名Name、用户年龄Age来创建的索引就是组合索引。此时,排序规则是左前缀原则,即先按照用户ID进行排序;当第一列值相同的情况下,则按照用户名Name第二列进行排序;依次类推。

      索引根据存储方式分为:

    (1)B-树索引;(2)哈希索引。

      虽然索引可以加快查询速度,提高 MySQL 的处理性能,但是过多地使用索引也会造成以下弊端:

    (1)创建索引和维护索引要耗费时间,这种时间会随着数据量的增加而增加。

    (2)除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。

    (3)当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

      注意:索引可以在一些情况下加速查询,但是在某些情况下,会降低效率。

      索引只是提高效率的一个因素,因此在建立索引的时候应该遵循以下原则:

    (1)在经常需要搜索的列上建立索引,可以加快搜索的速度。

    (2)在作为主键的列上创建索引,强制该列的唯一性,并组织表中数据的排列结构。

    (3)在经常使用表连接的列上创建索引,这些列主要是一些外键,可以加快表连接的速度。

    (4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,所以其指定的范围是连续的。

    (5)在经常需要排序的列上创建索引,因为索引已经排序,所以查询时可以利用索引的排序,加快排序查询。

    (6)在经常使用 WHERE 子句的列上创建索引,加快条件的判断速度。

      与此对应,在某些应用场合下建立索引不能提高 MySQL 的工作效率,甚至在一定程度上还带来负面效应,降低了数据库的工作效率,一般来说不适合创建索引的环境如下:

    (1)对于那些在查询中很少使用或参考的列不应该创建索引。因为这些列很少使用到,所以有索引或者无索引并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度,并增大了空间要求。

    (2)对于那些只有很少数据值的列也不应该创建索引。因为这些列的取值很少,例如人事表的性别列。查询结果集的数据行占了表中数据行的很大比例,增加索引并不能明显加快检索速度。

    (3)对于那些定义为 TEXT、IMAGE 和 BIT 数据类型的列不应该创建索引。因为这些列的数据量要么相当大,要么取值很少。

    (4)当修改性能远远大于检索性能时,不应该创建索引。因为修改性能和检索性能是互相矛盾的。当创建索引时,会提高检索性能,降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

    4、主键、唯一约束和唯一索引的区别。

      主键和唯一索引的区别是:

    (1) 主键一定是唯一索引,唯一索引并不一定就是主键。

    (2) 一个表中可以有多个唯一索引,但最多只能有一个主键。

    (3) 主键的列值不允许为空值,而唯一索引的列值最多有一个空值。

      通俗举例来说:主键相当于一本书的页码,索引相当于该书的目录。

      当创建或设置主键的时候,MySql会自动添加一个与主键对应的唯一索引,因此不需要再额外地添加把主键作为唯一索引的语句。数据库管理系统对于主键会自动生成一个唯一索引,所以主键是一个特殊的索引。可以通过SQL语句( "SHOW INDEX FROM tablename;" 或 "SHOW KEYS FROM tablename;" )查看已建表的索引。


     

      # SQL创建语句示例。
    
    CREATE TABLE `ik_admin`
    
    (
    
        `user_id`   bigint       NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    
        `user_name` varchar(50)  NOT NULL,
    
        `password`  varchar(128) NOT NULL,
    
        `role_id`   bigint       NOT NULL,
    
        `last_ip`   varchar(20)  NOT NULL DEFAULT '',
    
        `last_time` datetime     NULL,
    
        `email`     varchar(32)  NOT NULL DEFAULT '',
    
        `status`    tinyint(1)   NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-启用)',
    
        PRIMARY KEY (`user_id`),              # 主键:默认自动生成索引, 列值不能重复 而且不允许为空值。
    
        UNIQUE INDEX `userName` (`user_name`) # 唯一索引:列不能重复 但可以有空值(最多只有一个空值)。
    
    ) ENGINE = MyISAM AUTO_INCREMENT = 1001 DEFAULT CHARSET = utf8 COMMENT ='管理员表'; 

      唯一约束和唯一索引的区别:

    (1)唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有空值。

    (2)创建唯一约束的时候,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。

    (3)创建一个唯一索引,这个索引就是独立,可以单独删除。

    (4)如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。

    (5)如果表的一个字段,要作为另外一个表的外键,那么这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。

      索引的键不一定要和唯一约束的完全匹配,唯一约束可以只用索引的前导列。请看下面的例子:

    create table t (n1 number, n2 number);

    create index t_idx on t(n1, n2);

    上面只是创建了两个列的复合索引,并不要求是唯一索引。

    alter table t add constraint t_uk unique (n1) using index t_idx;

    可以使用这个索引来创建唯一约束,而且它只在第一个列上唯一,也就是说唯一约束比索引更加严格。

    那么这个索引的第二个列有什么意义?有些时候,带一些冗余列可以使得你直接从索引中取到所有SELECT的数据而无需回表。

    展开全文
  • 实际上,索引也是一张,该保存了主键与索引字段,并指向实体的记录。但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新的速度。因为更新时,My...

    2. 知识剖析

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

    创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

    但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度。

    因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

    普通索引

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

    因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。

    只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

    mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )

    唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作。

    mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {lolumn} )

    3. 常见问题

    如果表中没有所以会发生什么?

    一旦我们运行这个查询,在查找名字AAA的过程中,数据库不得不对表中的每一行检索并确定名字是否为AAA。

    由于我们想要得到每一个名字为AAA的用户信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。

    所以,必须一行一行的查找直到最后一行这就意味数据库不得不检查上千行数据才能找到所以名字为AAA的用户。这就是所谓的全表扫描。

    索引是怎么提升性能的?

    因为索引基本上是用来存储列值的数据结构,这使查找这些列值更加快速。

    如果索引使用最常用的数据结构-B-Tree-那么其中的数据是有序的。

    假设我们在name一列上创建一个B-Tree索引。这意味着当我们用之前的SQL查找姓名是AAA的用户时,不需要再扫描全表,而是用索引查找去查找名字为AAA的用户。

    因为索引已经按照按字母顺序排序。索引已经排序意味着查询一个名字会快很多,因为名字少字母为AAA的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。

    4. 解决方案

    使用索引的原则:

    1、装载数据后再建立索引。

    2、频繁搜索的列可以作为索引。

    3、在联接属性上建立索引(主外键)。

    4、经常排序分组的列。

    5、删除不经常使用的索引。

    6、指定索引块的参数,如果将来会在表上执行大量的insert操作,建立索引时设定较大的ptcfree。

    7、指定索引所在的表空间,将表和索引放在不同的表空间上可以提高性能。

    8、对大型索引,考虑使用NOLOGGING子句创建大型索引。

    不要在下面的列创建索引:

    1、仅包含几个不同值得列。

    2、表中仅包含几条记录。

    DEMO

    先创建user表

    CREATE TABLE user(

    id INT NOT NULL,

    number INT NOT NULL

    );

    普通索引

    ALTER TABLE USER ADD INDEX ID_INDEX(ID);

    唯一索引

    ALTER TABLE USER ADD UNIQUE NUMBER_INDEX(NUMBER);

    查看索引

    SHOW INDEX FROM USER;

    f4aed9f698598c9d6a962acd61495e1c.png

    展开全文
  • 如何使用Navicat给设置唯一索引

    千次阅读 2020-11-03 17:16:32
    设置其他 设置 1、点击鼠标左键选择,点击鼠标右键,选择设计 2、选则 索引 3、选择栏位,输入名,选择索引类型,选择索引方法 ...Mysql唯一索引和普通索引的区别 mysql的索引方法btree和hash的区别 ...

    设置

    • 1、点击鼠标左键选择表,点击鼠标右键,选择设计表
    • 2、选则 索引
    • 3、选择栏位,输入,选择索引类型,选择索引方法
    • 4、点击添加索引
    • 继续添加索引:重复第 3 步,第 4
    • 5、ctrl + s 保存
      在这里插入图片描述

    其他

    展开全文
  • * 如果没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引 * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引 其他 非聚簇 中有四条记录:  1, shenjian, m, A  3, zhangsan,...
  • --查找的所索引(包括索引名,类型,构成列:SELECT T.*, I.INDEX_TYPEFROM USER_IND_COLUMNS T, USER_INDEXES IWHERE T.INDEX_NAME = I.INDEX_NAMEAND T.TABLE_NAME = I.TABLE_NAMEAND T.TABLE_NAME = 表名--查找...
  • mysql 创建唯一约束

    千次阅读 2019-08-28 11:15:46
    UNIQUE 约束唯一标识数据库中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。 请注意,每个可以有多个 UNIQUE 约束,但是每个...
  • 删除唯一约束

    千次阅读 2020-07-10 17:43:42
    如何删除唯一约束 在一般的时候,我们修改的结构都是直接使用如下语句 alter table stu modify number varchar(20) 就是使用如下的SQL语句 alter table 表名 modify 的字段 改变后的结构 但是在修改...
  • oracle查询 索引、唯一约束、字段

    万次阅读 2022-01-19 15:10:19
    查询的索引情况 select t.Index_Name,t.table_name,t.column_name,i.tablespace_name,i.uniqueness from user_ind_columns t,user_indexes i where t.index_name=i.index_name and t.table_name=i.table_name ...
  • 我们从昨天开始纠结,为什么MySQL的分区唯一键必须加上分区字段? 以主键ID为例。 我们陷入了误区就是,我们一直认为加了分区字段前ID是唯一,加了分区字段后ID还是唯一的? 我们忽略的一点是,我们的结构变了...
  • 如何保证数据库中数据的唯一

    千次阅读 2019-09-11 10:42:55
    在很多时候,我们需要保证数据库中某条数据是唯一的,那如何保证数据库中数据的唯一性呢?这个值得探讨一下
  • 创建时定义索引 CREATE TABLE tablename( propname1 type1, …… propnamen type…n, UNIQUE INDEX | KEY [indexname] (propnamen [(length)] [ ASC | DESC ] ) ); 注意:参数UNIQUE INDEX和UNIQUE KEY是用来指定...
  • navicat设置中字段唯一约束

    万次阅读 2019-06-27 14:46:21
    首先进入设计: 如下界面点击索引: 如下设置: 栏位选择想要唯一约束的字段 点击保存即可
  • 数据库MySQL之主键约束、唯一约束是什么? 文章目录1. 主键约束2. 唯一约束2.1 UNIQUE KEY 1. 主键约束 主键可以写为PRIMARY KEY,也可以写成KEY 每张数据只能存在一个主键 主键保证记录的唯一性 主键自动为NOT ...
  • 给数据库添加唯一性约束

    千次阅读 2020-10-28 16:36:51
    给数据库添加唯一约束(就是一个字段不能重复) ALTER TABLE t_admin STRAINT uq_loginAcct UNIQUE (loginAcct) t_admin :表名 uq_loginAcct :约束名(随便起) loginAcct:添加约束的字段 给数据库撤销唯一...
  • 想要在主上创建一个自增的唯一建,保证这个字段在全局唯一(包括所有子)。 而又想用 PostgreSQL 10版本的分区的功能。 但在创建的时候,出现如下问题。看起来是 PostgreSQL 10版本不支持在分区上创建 ...
  • 唯一约束:unique 外键约束:foreign key 1.1 非空约束:not null 1)在创建时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非空 ); 2)创建后再添加非空约束: ALTER ...
  • mysql创建多个字段的唯一约束

    万次阅读 2018-11-16 16:12:33
    mysql中有些有时需要做一些字段的唯一约束,当然你也可以在insert前判断有无的方式来防止重复,如果不想额外增加代码来更灵活的实现一些字段的唯一约束,mysql提供了两种方式: 1.unique key  alter table xx ...
  • mysql中一个可以有几个唯一索引

    千次阅读 2021-09-04 04:39:38
    mysql中一个可以有多个唯一索引。 如果能确定某个数据列只包含彼此各不相同的值,那么在为这个数据列创建索引时,就应该使用关键字UNIQUE把它定义为一个唯一索引。 内容 如果能确定某个数据列将只包含彼此各不...
  • excel透视计数去重 Excel数据透视中的唯一计数 (Count Unique in Excel Pivot Table)In a previous article, Roger Govier showed us a couple of different ways to get a Unique count with a Pivot Table. ...
  • 一张中有往往有很多字段需要唯一性,数据不能重复,但是一张中只能有一个主键:唯一键就可以解决中有多个字段需要唯一性约束的问题。 唯一键的本质和主键差不多,唯一键允许为空,但不能重复,一张可以有...
  • ORA-00001: 违反唯一约束条件 这一个报错相信大家在插入数据时还是经常遇到的,尤其是在测试环境。 但是今天我在处理一个生产问题的时候再次遇到这个报错时有点奇怪: 1.该(记为A)的主键是数据库序列生成的,...
  • 在数据库设计中设置主键的字段是不会重复的、唯一的,如果有其他字段也需要保持唯一性应该如何设置呢?比如一个保存用户信息的表里要保证每条记录的手机号都不同。这时候就需要对该字段设置唯一性。 设置唯一性后的...
  • 记录一个hive中遇到的很有意思的问题,首先我建了两张临时,最终要把两张关联起来的时候,发现:两张中的关联字段都是唯一的,关联之后关联字段竟然不唯一了!关联方法用的left join。检验sql如下: SELECT ...
  • ORA-02449: 中的唯一/主键被外键引用 使用SQL: DROP TABLE TABLE_NAME 会报错 ORA-02449: 中的唯一/主键被外键引用;是因为正在被删除的这的外键或主键被使用,所以不能这么直接删除; 解决:使用 DROP ...
  • 第一种情况:使用数据库的主键做业务关联,order存user_id,goods存order_id;如果不是涉及到数据迁移,只是单库系统,这样做其实也没什么问题。 主键其实最原始的目的只是为了保证数据查找唯一,后面才是存储...
  • 在sql server中设置字段为唯一约束

    千次阅读 2020-04-02 16:29:07
    那就给大家详细的列举一下如何在 sql server中设置字段为唯一约束。 具体操作步骤: 新建数据库并设置可写权限 打开SQL Server管理器窗口,用本地用户登录;然后点击右键——新建数据库;完成之后将数据库...
  • 这周某系统上线,有一个需求就是,为一张修改唯一性约束,原因就是之前发现,由于唯一性约束设置不当,导致业务处理出现异常。举例来说,如下测试,原先唯一性约束是a和b俩字段,但发现实际业务中,a和b的组合是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,173,676
精华内容 469,470
关键字:

唯一是表什么的