精华内容
下载资源
问答
  • 实体完整性规则是指若属性A是基本关系R的主属性 ,则属性A不能取空值。若外键不是主属性,则可以取空值,反之不可以取空值。

    实体完整性规则是指若属性A是基本关系R的主属性 ,则属性A不能取空值。若外键不是主属性,则可以取空值,反之不可以取空值。

    展开全文
  • MySQL列属性约束及存储引擎

    千次阅读 2015-08-03 20:18:30
    属性约束,保证表的结构和数据的正确性和稳定性。总的来说有五种:唯一性和主键约束、...是否为空规定一个字段的值,是否可以是null。 null(默认) 或 not null Null表示没有值。与任何数据不同。表示什么都没有。

    列属性约束,保证表的结构和数据的正确性和稳定性。

    总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
    五大关键词:UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT

    是否为空

    规定一个字段的值,是否可以是null。
    null(默认) 或 not null
    Null表示没有值。与任何数据不同。表示什么都没有。
    如果一个列不允许为空,但是在赋值时,没有为该字段赋值,则会出现问题。
    Mysql的每条记录,如果存在可以为null的字段,则需要使用一个字节保存哪些字段是空。

    create table one(
    a int not null,
    b int 
    );
    insert into one (a) values(10);
    select * from one;

    默认值属性

    使用default value来声明
    DEFAULT子句用于为列指定一个默认,当该字段不存在值时,会被启用。
    默认值必须为一个常数,不能为一个函数或一个表达式。
    可以不存在default,但是mysql会判断:
    如果该列可以为空,则默认值为null;如果不可以,则不设置默认值。

    注意:
    可以在处理数据时,使用default,显示地使用默认值。
    有些列是不能有默认值的:Blob,text。
    时间戳类型,可以设置一个特殊的默认值 CURRENT_TIMESTAMP。在当列不存在或者传递的值为null时,使用当前的时间戳。

    drop table two;
    create table two(
    a int not null default 10,
    b int not null default 20, 
    c int default 30,
    d int
    );
    insert into two(a) values(10);
    insert into two(b) values(10);
    select * from two;


    默认值,在没有为该字段设置值是启用。
    而且默认值的设置需要使用固定值。

    常见场景
    一个字段不能为空,而且存在默认值。

    主键约束

    主键(PK,primary key)就是可以唯一标识某条记录的字段或者是字段的集合。
    主关键字是表中的一个或多个字段,要求主键的值不能重复,只能有一个主键。
    如果还存在不重复的记录,可以定义成唯一索引,提高检索效率。
    主键不能为空,不设置或者null都会变成not null。


    主键可以是真实实体的属性
    但是常用的好的解决方案是:
    利用一个与实体信息不相关的属性,作为唯一标识。
    主键与业务逻辑不发生关系。只用来标识记录。(自身保证不冲突,主键不属于当前实体的任何属性。)

    设置主键的语法:通过primary key完成
    两种方案:
    1、字段上设置

    drop table teacher;
    create table teacher(
    t_id int primary key,
    t_name varchar(10),
    classname varchar(6),
    days tinyint unsigned
    )character set gbk;
    insert into teacher values(1,'周杰伦','0324',32);
    insert into teacher values(-1,'刘德华','0334',35);
    
    show create table teacher\G

    主键不能为空,也不能重复。一个字段是主键的话,自动设置不为空。

    2、在定义完字段后,可以定义
    通过这种方式可以定义多列主键。

    create table teacher(
    t_id int,
    t_name varchar(10),
    classname varchar(6),
    days tinyint unsigned,
    primary key (t_id)
    );

    组合主键

    drop table teacher;
    create table teacher(
    t_name varchar(10),
    classname varchar(6),
    days tinyint unsigned,
    primary key (t_name,classname)
    );

    注意:
    组合主键表示一个主键内包括多个字段,而不是多个字段都是主键;只需要一个唯一标识即可,mysql规定只能存在一个主键。

    通过修改表来删除主键 alter table tbl_name drop primary key;
    通过修改表来增加主键Alter table tb add primary key(id);

    主键字段原则上在插入后,应该不被修改,但是语法上可以修改,但是修改的值不能与已有值冲突。

    主键常见的设计:
    每个表都应该存在一个可以唯一标识的主键字段,
    最好与实体没有联系,不是实体属性字段。

    自动增长

    为每条记录提供给一个唯一的标识。
    每次插入记录时,将每个字段的值自动增加1。
    使用auto_increment标识。

    需要整型,还需要有索引。

    通常自动增长是从1开始递增,但是可以通过修改表属性,更改初始值。
    表属性 auto_increment=x;(如果比已存在的小,则会从已有的最大值新记录)

    drop table teacher;
    create table teacher(
    t_id int primary key auto_increment,
    t_name varchar(10),
    classname varchar(6),
    days tinyint unsigned
    );
    insert into teacher values(null,'周杰伦','0324',32);
    insert into teacher values(null,'刘德华','0334',35);
    
    insert into teacher (t_name,classname,days)values('周韦彤','0324',31);
    
    select * from teacher;

    自动增长的初始值:是可以设置的,默认是1。
    通过表的选项:auto_increment n

    alter table teacher auto_increment 10;
    select * from teacher;
    insert into teacher values(null,'范冰冰','0334',35);
    select * from teacher;

    自动增长是否可以手动插入该列的值?
    仍然可以手动插入。
    如果是主键的话,该列不能重复,否则,可以重复。
    insert into teacher values(7,’范冰冰’,’0334’,35);

    自动增长该列是否可以更新?
    可以

    update teacher set t_id=100 where t_name='范冰冰';
    delete from teacher where t_name='范冰冰';

    如何删除自增长的主键id?
    先删除自增长,在删除主键。

    Alter table tb change id id int(10);//删除自增长
    Alter table tb drop primary key;//删除主建
    Alter table test change id id int;//删除自增长
    Alter table test drop primary key;//删除主键
    
    insert into test values(6,'mark',5);

    实体之间的关系

    1:1 一对一
    两个实体表内,存在相同的主键字段。
    如果记录的主机值等于另一个关系表内的记录的主机主键值,则两条记录一一对应。

    1:n 一对多
    一个实体,对应多个其他实体
    例如:一个班级对应多个学生

    设计:
    在多的那端,增加一个字段,
    用于指向该实体所属的另外的实体的唯一标识,即主键。

    m:n 多对多
    设计:
    典型的是利用一个中间表,表示实体之间的关系。

    中间表的每个记录,表示一个关系。
    一个M:N可以通过1:M,1:N来实现。

    外键

    如果一个实体(student)的某个字段(class_id),指向(引用)另一个实体(class)的主键(class_id),就称student实体的class_id是外键。

    被指向的实体(class),称之为主实体,也叫(父实体)。
    负责指向的实体,称之为从实体(从表),也叫子实体(子表)。

    作用:
    用于约束处于关系内的实体。

    需要解决的问题?
    增加子表记录时,是否有与之对应的父表记录。
    在删除或者更新主表记录时,从表应该如何处理相关的记录。

    如何定义一个外键?
    在从表上,增加一个字段,指向主表的主键。
    使用关键字 foreign key

    drop table if exists class;
    create table class(
    class_id int primary key auto_increment,
    class_name varchar(20) not null default 'deeplearning' comment '班级名称'
    )character set utf8;

    set names gbk;客户端与服务器端通信的编码
    character set utf8这里的utf8是数据存储到服务器的编码。

    drop table if exists student;
    create table student(
    stu_id int primary key auto_increment,
    stu_name varchar(10) not null default '',
    class_id int,
    foreign key (class_id) references class(class_id)
    )character set utf8;

    必须主表里面先有数据,才能在从表中插入数据。

    insert into class values (null,'c program design');
    insert into student values (null,'张三丰',1);

    设置级联操作
    在主表数据发生改变时,与之关联的从表数据应该如何处理。
    主表更新,主表删除时:使用关键字on updateon delete来标识。

    允许的级联动作:
    cascade关联操作,如果主表被更新或删除,那么从表也会执行相应的操作。
    set null,设置null,表示从表不指向任何主表记录。
    restrict,拒绝主表的相关操作。

    修改外键:
    先删除,再新建,通过修改表完成。
    alter table table_name drop foreign key(class_id);
    删除外键需要用指定外键名称达到目的,可以通过在创建外键时指定名称
    或者使用mysql默认生成的名称。
    show create table student\G

    alter table student drop foreign key student_ibfk_1;

    增加外键,设置删除时将从表的数据设置为null
    alter table table_name add foreign key(外键);

    alter table student add foreign key (class_id) 
    references class(class_id)
    on delete set null;
    
    show create table student\G
    
    select * from class;
    select * from student;
    
    delete from class where class_id=2;
    select * from class;
    select * from student;

    on delete
    增加外键,设置删除时将从表的数据同时也删除。

    insert into class values (1,'c program design');
    update student set class_id=1 where stu_id = 1; 
    
    alter table student drop foreign key student_ibfk_1;
    
    alter table student add foreign key (class_id) 
    references class(class_id)
    on delete cascade;
    
    select * from class;
    select * from student;
    delete from class where class_id=1;
    select * from class;
    select * from student;

    on update
    指的是只有主表的主键发生变化,才会对从表产生影响。

    insert into class values (1,'c program design');
    insert into student values (1,'张三丰',1);
    
    select * from class;
    select * from student;
    
    alter table student drop foreign key student_ibfk_1;
    alter table student add foreign key (class_id) 
    references class(class_id)
    on delete cascade
    on update restrict;

    update class set class_id=2 where class_id=1;不能操作成功

    更新存在关联的主表数据的主键字段

    alter table student drop foreign key student_ibfk_1;
    alter table student add foreign key (class_id) 
    references class(class_id)
    on delete cascade
    on update cascade;

    存储引擎


    默认的服务器表类型,通过my.ini可以配置。
    default-storage-engine=INNODB

    在创建表或编辑表时,可以指定表的存储引擎。
    利用表属性:engine 引擎类型
    通过engine myisam,engine innodb 在创建时指定。

    alter table class engine myisam; 不能操作成功,有外键。

    注意:外键只被innodb存储引擎所支持。其他引擎是不支持的。

    create table classroom(
    room_id int primary key auto_increment,
    room_no char(3)
    )engine myisam character set utf8;

    myisam与innodb区别
    1、保存文件的方式不同
    myisam:一个表三个文件。tablename.frm结构,tablename.myd数据,tablename.myi索引
    innodb:一个表一个文件。tablename.frm结构
    所有的innodb表,都使用相同的innodb存储表空间在保存数据和索引。

    2、Innodb很多时候是行级锁,而myisam是表级锁,innodb的并发高

    3、MyIASM支持索引压缩,而Innodb索引和数据是绑定保存不压缩,体积大。

    4、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
    但是MyISAM只要简单的读出保存好的行数即可。
    注意:当count(*)语句包含 where条件时,两种表的操作是一样的。

    myisam适于插入,查找。
    innodb适于更新,删除。

    选择存储引擎的依据:
    1、性能
    2、功能

    展开全文
  • 因为Integer的默认值为null,数据库的主键或者外键不能为空,但是可以为null 什么时候用int : 如果表示数量用int,因为int的默认值为0,它不能为null或者空 转载于:...

    什么时候用Integer :

    如果该属性所对应的数据库的字段是主键或者是外键时,用Integer;因为Integer的默认值为null,数据库的主键或者外键不能为空,但是可以为null

    什么时候用int :

    如果表示数量用int,因为int的默认值为0,它不能为null或者空

    转载于:https://www.cnblogs.com/chengxuy/p/6491055.html

    展开全文
  • 什么是关系型数据库

    2018-09-28 19:52:00
    关系型数据库里有三个关系,实体对象...你可以简单的想象EXCEL的一个sheet中的表格。2、记录是指这个表中有多少行,而字段是指这个表中有多少列。3、一般来说,定义表的时候,定义的是列数、列名、列的属性(比如...

    关系型数据库里有三个关系,实体对象和元数据的关系(主码)。实体对象之间的关系(外键);记录之间的关系(元数据相同,内容类型不同。类型特指:空,有,长,短)。

    1、关系型数据库里面的表,指的是二维关系的表,即由行和列组成的表。你可以简单的想象为EXCEL的一个sheet中的表格。
    2、记录是指这个表中有多少行,而字段是指这个表中有多少列。
    3、一般来说,定义表的时候,定义的是列数、列名、列的属性(比如数值、字符还是日期等等)、列的约束条件(如不能为空、允许多长的字符等等),这个术语叫DDL(数据操作语言)。
    4、而表定义好之后,后续的操作是对记录的操作和维护(比如插入、删除、修改、更新),这个术语叫DML(数据维护语言)。
    5、无论是DDL还是DML,一般都是用sql语言来实现的(当然,每种不同的数据库也会提供相应的图形化界面),不过sql语言还是必须要学的。

    转载于:https://www.cnblogs.com/huangsxj/p/9720538.html

    展开全文
  • mysql 基础面试题1

    2019-09-12 15:44:45
    主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。 外键(外码) :外键用来和其他表建立联系用,外键是另一表的主键,外键可以有重复的,可以是空值。一个表可以有多个外键...
  • A:主键是能确定一条记录的唯一标志,不可以有重复的,也不可以为空 外键:如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键 用于是保持数据的一致性,可以为空,也允许...
  • 这是一个针对 SqlServer 和 C# 的数据库的小工具,可以利用这个小工具生成数据库表对应的 Model,并且会判断数据表列是否可以为空可以为空的情况下会使用可空的数据类型,如 int? , DateTime? ,如果数据库中有列...
  • 主键:唯一标识一条记录,不能有重复的,不允许为空外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录...
  • JAVA备忘录(四):线程池面试题

    千次阅读 2020-01-20 17:52:12
    一.基本概念 1.超键,候选键,主键,外键什么 超键:在关系中能够唯一标识一个元组的属性集称为超键。...主键的取值不能为空外键:在一个关系模式中,存在一个属性,它是其他关系模式的主键,那...
  • 一.基本概念 1.超键,候选键,主键,外键什么 超键:在关系中能够唯一标识一个元组的属性集称为超键。...主键的取值不能为空外键:在一个关系模式中,存在一个属性,它是其他关系模式的主键,那...
  • 【面试】数据库方面

    2019-10-03 14:57:40
    一个数据列只能有一个主键, 且主键的取值不能缺失,即不可为空(Null)。 超键:在关系中能唯一标识元组的属性集称为关系模型的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含...
  • IFS中备注里的FLAGS标志的意思

    千次阅读 2006-05-31 10:34:00
    备注中的FLAGS=AMIUL是什么意思?我在IFS系统中看到大约有100个不同的取值A:是否主键(K为外键;P:为主键;A为属性)M:是否必需要填。可以为空I:是否可以InsertU:是否可以UpdateL:直列表是否显示Lov个人理解大致如此;
  • 数据库中几个基本概念 主码 外码

    万次阅读 多人点赞 2015-07-17 10:20:22
    什么是主码,主码是一个能唯一标识一个元组的属性。在一个关系(表)中,主码不一定只有一个,但是一定要有的。因为元组,是对世界中某种事物的数据描述,而世界中各种事物,都具有唯一性,都是可以区分的。在计算机...
  • 数据库 主码 外码

    千次阅读 2019-10-03 09:32:59
    什么是主码,主码是一个能唯一标识一个元组的属性。在一个关系(表)中,主码不一定只有一个,但是一定要有的。因为元组,是对世界中某种事物的数据描述,而世界中各种事物,都具有唯一性,都是可以区分的。在计算机...
  • jpivot学习总结.doc

    2011-12-09 08:38:08
    name Hierarchy 的名称,该值可以为空,为空时表示 Hirearchy 的名字和 Dimension 的名字相同。当一个 Dimension 有多个 Hierarchy 时,注意 name 值要唯一。 hasAll 布尔型的 , 决定是否包含全部的成员 member ...
  • 数据库资料

    2018-04-01 22:00:33
    SQL Server中存在五种约束,分别是:主键约束、外键约束、检查约束、默认约束和唯一性约束(唯一性约束将在后续课程中使用SQL语句实现)总结创建数据库表需要:确定表的列名、数据类型、是否允许为空,还需要确定...
  • 例如,长度8的线性表关键码序列:[6,13,27,30,38,46,47,70],被查元素38,首先将与线性表的中间项比较,即与第4个数据元素30相比较,38大于中间项30的值,则在线性表[38,46,47,70]中继续查找;...
  • “%”可以代表任意长度的字符串,长度可以为0; “_”只能表示单个字符。 如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为一个汉字是两个字符,而一个“_”符号只能代表一个字符...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    空值当成无穷大处理,所有空值参与的运算皆为空。 空值与空值并不相等,因为空值不能直接运算。 如:prod_price="" 这种写法是错的(不要受到corejava的影响) prod_price=NULL 这种写法是错的(不要受到corejava的...
  • PHP面试题汇总

    2020-12-09 13:38:34
    当要 判断一个变量是否已经赋予数据且不为空 可以用 <code>empty函数; 当要 判断 一个变量 存在且不为空 先 <code>isset</code> 函数 再用 <code>empty</code> 函数; </p><p>该提问来源于开源...
  • java面试800题

    2011-09-13 20:25:48
    Q0034 给定了一些创建数据库试图的SQL语句问什么条件下才可以对试图执行修改,增加,删除操作 特别强调了WITH CHECK OPTION这个约束的含义,使用,产生的不同结果。参考Oracle 视图的基本知识,单个表上的视图,多...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    13.填写下面的语句,使其可以为Class表的ID列添加一个名为PK_CLASS_ID的主键约束。 ALTER TABLE Class Add ____________ PK_LASS_ID (Constraint) PRIMARY KEY ________ (ID) 14. 每个Oracle 10g数据库在创建后都...
  • 对这样设计出来的数据库,只需多问几个为什么——业务模型是如何体现的?数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.  这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际...
  • 对这样设计出来的数据库,只需多问几个为什么——业务模型是如何体现的?数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.  这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

为什么外键属性可以为空