精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201605/24/1464097509_539932.png)
  • NULL为什么多人用?1、NULL是创建数据表时默认的,初级或不知情...那么将字段设置允许null有什么坏处呢?1:查询语句中包含允许null字段的那些查询,mysql难以优化,而且它会使索性、索引统计和更加复杂。2:可...

    NULL为什么多人用?

    1、NULL是创建数据表时默认的,初级或不知情的或怕麻烦的程序员不会注意这点。

    2、很多人员都以为not null 需要更多空间,其实相反。

    3、重点是很多程序员觉得NULL在开发不用去判断插入数据,写sql语句的时候更方便快捷。

    那么将字段设置成允许null有什么坏处呢?

    1:查询语句中包含允许null字段的那些查询,mysql难以优化,而且它会使索性、索引统计和值更加复杂。

    2:可空列需要更多的存储空间。官方文档中写到:“NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”就是说允许为空的字段需要一个额外字节作为判断是否为NULL的标志位。

    3:能导致myisam索引中固定大小索引变成可变大小索引。

    基于以上说明,字段设置成not null比设置成allow null要好很多,那在生产环境中把那些allow null的字段改成not null的字段会怎样?

    一方面:可能有些记录,这个字段已经是空的,所以改成not null会失败

    另一方面,有人提到说将allow null改成 not null对性能提升很小。对这一点不是很清楚。

    展开全文
  • 1.有说把可否为空选项设置为“可以为空”,可我这“ID”字段是主键,怎么可能设置为可空?否决 2.说把标识规范设置为“是”,如下图,但是,标识规范选择为“是”是给字段增加自增功能,这应该要求字段类型...

    MVC,使用EF构建实体。将数据存入数据库,执行到_db.SaveChange()时,会报如下错误:

    在进行数据库数据存储时,经常会碰到这个问题,这个错误的成因有多种,上网搜解决方法,如下:

    1.有说把可否为空选项设置为“可以为空”,可我这“ID”字段是主键,怎么可能设置为可空?否决

    2.说把标识规范设置为“是”,如下图,但是,标识规范选择为“是”是给字段增加自增功能,这应该要求字段类型是整型吧?我的字段类型为“Guid",不能修改标识规范为”是“,所以,第二种解决方案解决不了我的问题,否决

    网上基本就这两种解决方案,都不能解决问题,诶,还得自己慢慢找,终于:

    解决方法:

      第一步:打开.edmx文件,选中出错的字段,在右边的属性框中,将StoreGeneratedPattern 设置为”None“,如下图:

    第二步:右键.edmx文件中的表视图,选择”根据模型生成数据库“,如下

    第三步:傻瓜操作,什么都不用管,直接点“完成”  “是”  “是”

    第四步:运行程序,问题解决,哈哈!

     

    转载于:https://www.cnblogs.com/Vennet/p/4037223.html

    展开全文
  • null

    2007-08-02 10:35:00
    写程序的时候,发现写的一个存储过程怎么执行都没有结果...都是因为把其中一个设置允许空,结果初始就是null怎么操作就是没反应。 转载于:https://www.cnblogs.com/standas/archive/2007/08/02/839941.html...
         写程序的时候,发现写的一个存储过程怎么执行都没有结果,直接执行运行sql语句,提示操作成功,影响了多少行,可数据库中的数据还是没有修改。都是因为把其中一个设置为允许空,结果初始值就是null,怎么操作就是没反应。

    转载于:https://www.cnblogs.com/standas/archive/2007/08/02/839941.html

    展开全文
  • GitHub地址:abel-max/Java-Study-NoteHashMap 简介HashMap 是一个基于哈希表实现的无序的 key-value 容器,它键和值允许设置null,同时它是线程不安全的。HashMap 底层实现在 jdk 1.7中 H...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!

    GitHub地址:abel-max/Java-Study-Note

    HashMap 简介
    HashMap 是一个基于哈希表实现的无序的 key-value 容器,它键和值允许设置为 null,同时它是线程不安全的。HashMap 底层实现

    • 在 jdk 1.7中 HashMap 是以数组+链表的实现的
    • 在 jdk1.8 开始引入红黑树,HashMap 底层变成了数组+链表+红黑树实现

    红黑树简介
    红黑树是一种特殊的平衡二叉树,它有如下的特征:

    • 节点是红色或黑色
    • 根节点是黑色的
    • 所有叶子都是黑色。(叶子是NULL节点)
    • 每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

    所以红黑树的时间复杂度为: O(lgn)。jdk1.8:数组+链表+红黑树
    HashMap 的底层首先是一个数组,元素存放的数组索引值就是由该元素的哈希值(key-value 中 key 的哈希值)确定的,这就可能产生一种特殊情况——不同的 key 哈希值相同。
    在这样的情况下,于是引入链表,如果 key 的哈希值相同,在数组的该索引中存放一个链表,这个链表就包含了所有 key 的哈希值相同的 value 值,这就解决了哈希冲突的问题。
    但是如果发生大量哈希值相同的特殊情况,导致链表很长,就会严重影响 HashMap 的性能,因为链表的查询效率需要遍历所有节点。于是在 jdk1.8 引入了红黑树,当链表的长度大于8,且 HashMap 的容量大于64的时候,就会将链表转化为红黑树。

    // jdk1.8
    // HashMap#putVal
    
    // binCount 是该链表的长度计数器,当链表长度大于等于8时,执行树化方法
    // TREEIFY_THRESHOLD = 8
    if (binCount >= TREEIFY_THRESHOLD - 1)
        treeifyBin(tab, hash);
    
    // HashMap#treeifyBin    
    final void treeifyBin(Node<K,V>[] tab, int hash) {
        int n, index; Node<K,V> e;
        // MIN_TREEIFY_CAPACITY=64
        // 若 HashMap 的大小小于64,仅扩容,不树化
        if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
            resize();
        else if ((e = tab[index = (n - 1) & hash]) != null) {
            TreeNode<K,V> hd = null, tl = null;
            do {
                TreeNode<K,V> p = replacementTreeNode(e, null);
                if (tl == null)
                    hd = p;
                else {
                    p.prev = tl;
                    tl.next = p;
                }
                tl = p;
            } while ((e = e.next) != null);
            if ((tab[index] = hd) != null)
                hd.treeify(tab);
        }
    }

    加载因子为什么是0.75
    所谓的加载因子,也叫扩容因子或者负载因子,它是用来进行扩容判断的。
    假设加载因子是0.5,HashMap 初始化容量是16,当 HashMap 中有 16 * 0。5=8个元素时,HashMap 就会进行扩容操作。
    而 HashMap 中加载因子为0.75,是考虑到了性能和容量的平衡。
    由加载因子的定义,可以知道它的取值范围是(0, 1]。

    • 如果加载因子过小,那么扩容门槛低,扩容频繁,这虽然能使元素存储得更稀疏,有效避免了哈希冲突发生,同时操作性能较高,但是会占用更多的空间。
    • 如果加载因子过大,那么扩容门槛高,扩容不频繁,虽然占用的空间降低了,但是这会导致元素存储密集,发生哈希冲突的概率大大提高,从而导致存储元素的数据结构更加复杂(用于解决哈希冲突),最终导致操作性能降低。
    • 还有一个因素是为了提升扩容效率。因为 HashMap 的容量(size属性,构造函数中的initialCapacity变量)有一个要求:它一定是2的幂。所以加载因子选择了0.75就可以保证它与容量的乘积为整数。
    // 构造函数
    public HashMap(int initialCapacity, float loadFactor) {
        // ……
        this.loadFactor = loadFactor;// 加载因子
        this.threshold = tableSizeFor(initialCapacity);
    }
    
    /**
     * Returns a power of two size for the given target capacity.返回2的幂
     * MAXIMUM_CAPACITY = 1 << 30
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

    HashMap 的容量为什么是2的 n 次幂
    HashMap 的默认初始容量是16,而每次扩容是扩容为原来的2倍。这里的16和2倍就保证了 HashMap 的容量是2的 n 次幂,那么这样设计的原因是什么呢?原因一:与运算高效
    与运算 & ,基于二进制数值,同时为1结果为1,否则就是0。如1&1=1,1&0=0,0&0=0。使用与运算的原因就是对于计算机来说,与运算十分高效。原因二:有利于元素充分散列,减少 Hash 碰撞
    在给 HashMap 添加元素的 putVal 函数中,有这样一段代码:

    // n为容量,hash为该元素的hash值
    if ((p = tab[i = (n - 1) & hash]) == null)
        tab[i] = newNode(hash, key, value, null);


    它会在添加元素时,通过 i = (n - 1) & hash 计算该元素在 HashMap 中的位置。
    当 HashMap 的容量为 2 的 n 次幂时,他的二进制值是100000……(n个0),所以n-1的值就是011111……(n个1),这样的话 (n - 1) & hash 的值才能够充分散列。
    举个例子,假设容量为16,现在有哈希值为1111,1110,1011,1001四种将被添加,它们与n-1(15的二进制=01111)的哈希值分别为1111、1110、1110、1011,都不相同。而假设容量不为2的n次幂,假设为10,与上述四个哈希值进行与运算的结果分别是:0101、0100、0001、0001。可以看到后两个值发生了碰撞。所以 HashMap 的容量设置为 2 的 n 次幂有利于元素的充分散列。HashMap初始容量为什么是2的n次幂及扩容为什么是2倍的形式HashMap 是如何导致死循环的
    HashMap 会导致死循环是在 jdk1.7 中,由于扩容时的操作是使用头插法,在多线程的环境下可能产生循环链表,由此导致了死循环。在 jdk1.8 中改为使用尾插法,避免了该死循环的情况。

    来源:https://www.tuicool.com/articles/ieQVzqi

    以下篇章来自博客【占小狼】
    原文链接:https://blog.csdn.net/maohoo/article/details/81531925

    问题
    如果是在单线程下使用HashMap,自然是没有问题的,如果后期由于代码优化,这段逻辑引入了多线程并发执行,在一个未知的时间点,会发现CPU占用100%,居高不下,通过查看堆栈,你会惊讶的发现,线程都Hang在hashMap的get()方法上,服务重启之后,问题消失,过段时间可能又复现了。
    这是为什么?原因分析
    在了解来龙去脉之前,我们先看看HashMap的数据结构。
    在内部,HashMap使用一个Entry数组保存key、value数据,当一对key、value被加入时,会通过一个hash算法得到数组的下标index,算法很简单,根据key的hash值,对数组的大小取模 hash & (length-1),并把结果插入数组该位置,如果该位置上已经有元素了,就说明存在hash冲突,这样会在index位置生成链表。
    如果存在hash冲突,最惨的情况,就是所有元素都定位到同一个位置,形成一个长长的链表,这样get一个值时,最坏情况需要遍历所有节点,性能变成了O(n),所以元素的hash值算法和HashMap的初始化大小很重要。
    当插入一个新的节点时,如果不存在相同的key,则会判断当前内部元素是否已经达到阈值(默认是数组大小的0.75),如果已经达到阈值,会对数组进行扩容,也会对链表中的元素进行rehash。源码分析
    HashMap的put方法实现:
    1、判断key是否已经存在

    public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        // 如果key已经存在,则替换value,并返回旧值
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
    
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }
    1234567891011121314151617181920212223


    2、检查容量是否达到阈值threshold

    void addEntry(int hash, K key, V value, int bucketIndex) {
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }
    
        createEntry(hash, key, value, bucketIndex);
    }
    123456789


    如果元素个数已经达到阈值,则扩容,并把原来的元素移动过去。
    3、扩容实现

    void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }
    
        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable, initHashSeedAsNeeded(newCapacity));
        table = newTable;
        threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
    }
    12345678910111213


    这里会新建一个更大的数组,并通过transfer方法,移动元素。

    void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        for (Entry<K,V> e : table) {
            while(null != e) {
                Entry<K,V> next = e.next;
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }
    123456789101112131415


    移动的逻辑也很清晰,遍历原来table中每个位置的链表,并对每个元素进行重新hash,在新的newTable找到归宿,并插入。
    案例分析
    假设HashMap初始化大小为4,插入个3节点,不巧的是,这3个节点都hash到同一个位置,如果按照默认的负载因子的话,插入第3个节点就会扩容,为了验证效果,假设负载因子是1.

    void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        for (Entry<K,V> e : table) {
            while(null != e) {
                Entry<K,V> next = e.next;
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }
    123456789101112131415


    以上是节点移动的相关逻辑。

    59de3bdd6c9a189424222cefe4166543.png


    插入第4个节点时,发生rehash,假设现在有两个线程同时进行,线程1和线程2,两个线程都会新建新的数组

    6f1c469fd8c2b6fb0b43a3ea98d4f6fe.png


    假设线程2 在执行到Entry < K,V > next = e.next;之后,cpu时间片用完了,这时变量e指向节点a,变量next指向节点b。线程1继续执行,很不巧,a、b、c节点rehash之后又是在同一个位置7,开始移动节点第一步,移动节点a

    8625bc6b554e27152238314ea512379e.png


    第二步,移动节点b

    6143640f3be420f2d4e8895e8e0b7c26.png


    注意,这里的顺序是反过来的,继续移动节点c

    7dacfb0e12126b3d7319e81e39c7b777.png


    这个时候 线程1 的时间片用完,内部的table还没有设置成新的newTable, 线程2 开始执行,这时内部的引用关系如下:

    00d4462b9340ff4365fc97a1830f01cb.png


    这时,在 线程2 中,变量e指向节点a,变量next指向节点b,开始执行循环体的剩余逻辑

    Entry<K,V> next = e.next;
        int i = indexFor(e.hash, newCapacity);
        e.next = newTable[i];
        newTable[i] = e;
        e = next;
    12345


    执行之后的引用关系如下图

    bee4f6733c2e0c5b6511ed6fea608505.png


    执行后,变量e指向节点b,因为e不是null,则继续执行循环体,执行后的引用关系

    b0a62726194f56b196d7548b8b7cdca7.png


    变量e又重新指回节点a,只能继续执行循环体,这里仔细分析下:

    1、执行完Entry < K,V > next = e.next;,目前节点a没有next,所以变量next指向null;

    2、e.next = newTable[i]; 其中 newTable[i] 指向节点b,那就是把a的next指向了节点b,这样a和b就相互引用了,形成了一个环;

    3、newTable[i] = e 把节点a放到了数组i位置;

    4、e = next; 把变量e赋值为null,因为第一步中变量next就是指向null;
    所以最终的引用关系是这样的:

    b70611f3d6f05d2f9605d48b6915750a.png


    节点a和b互相引用,形成了一个环,当在数组该位置get寻找对应的key时,就发生了死循环。
    另外,如果线程2把newTable设置成到内部的table,节点c的数据就丢了,看来还有数据遗失的问题。
    总结所以在并发的情况,发生扩容时,可能会产生循环链表,在执行get的时候,会触发死循环,引起CPU的100%问题,所以一定要避免在并发环境下使用HashMap。
    曾经有人把这个问题报给了Sun,不过Sun不认为这是一个bug,因为在HashMap本来就不支持多线程使用,要并发就用ConcurrentHashmap。

    展开全文
  • SQL SERVER 允许修改表设计

    千次阅读 2018-12-08 20:26:55
    数据库中有些列是可以允许null值的,起初想禁止null值,在实际修改中保存时显示不可以保存 问题解决 其实很简单,就像你没有权限或者权限被禁止一样,只要获得相应的权限就可以 步骤:工具–选项–设计器–表设计...
  • 有时我们需要查询出某字段没有的全部记录,那应该用rs("xx")=""还是IsNull(rs("xx"))呢?要得出结论,我们还得从头说起:什么情况下字段中会...1.将aa字段"允许空字符串"属性设置为否,测试结果 rs("aa")=...
  • 点击蓝字 关注我们 一起摇摆什么叫约束条件,约束条件就是控制我们往...前2列是字段名和字段的类型,后4列都属于约束条件,每一列约束的条件都不一样NULL:代表的是允不允许为空,如果NULL里边的是YES,那就代表...
  • 接口测试通过输入使用参数组合,获得服务器返回值,并更具预先设置的规则判断是否符合预期。在接口测试中,根据接口的功能不同,需要侧重检测的方面也不同。主要从以下几个方面考虑测试用例设计: 1)参数类型(数值...
  • 文章目录1.非空约束(1)null(允许空值):(2)not null(不允许空值):2....非空约束在前面的数据表定义过程中,每个字段都要有一个是否为null值的选择,这就是对数据表中将来的数据提出的约束条件。(1)nu...
  • com.microsoft.sqlserver.jdbc.SQLServerException: 不能将 NULL 插入列 'guest_id',表 'sinwa.dbo.guest';列不允许有空值。INSERT 失败。 怎么样才能把 guest_id 和guest_name 传给action 呢?我只想用Ext....
  • rrequest.getWResponse().getMessageCollector().alert("输入的年龄:"+age+"起出范围,只能输入10到20之间的数字",null,true); } }catch(NumberFormatException nfe) { rrequest....
  • 今天面试,一个面试官问我@Autowired与@Resource的区别,一时我有点蒙,因为平时都是用框架,还真没怎么注意过他们的区别,平时都是用@Autowired注解,很少用@Resource注解,我回来...如果允许null值。可以设置它...
  • def __set__(self, instance, value): #设置字段的 字段名-- self.validate(value) #set之前先校验数据 instance.__dict__[self.name] = value #给对应属性名设置值 def __str__(self): #字段实例的...
  • //系统允许多项式的最大 const int Number=40;//设置输入多项式时字符串长度最大限,也可以根据需求任意设置 int order;//设置多项式显示方式0代表降幂显示,1代表升幂显示 class node//定义一个node类,处理...
  • 1. 学习项目代码,今天突然看到public double? LastWeek { get;...表示允许null. 当有一个?时,代表 int? a = null; 等效于:Nullable<int> a = null; 当有两个?时,int result = a...
  • 在报表参数属性中设置"允许null"(报表参数怎么打开:按ctrl+alt+d可以调出报表数据,然后点开参数,右击,参数属性) 试过以后还是报这个错。 最终发现问题解决方法是:右击要操作的rdlc文件,点开属性,将复制到...
  • 在数据库的使用过程中我们经常要限制字段的取值,比如有些字我们不能让它为空,我们就...4.怎么设置字段的自动增加 auto_increment。 怎么添加唯一约束 唯一约束(Unique Constraint)要求该列唯一,允许为空,但是
  • int、time和timestamp区别

    千次阅读 2017-09-05 13:35:25
    1.datetime占用8 byte,允许为空,与时区无关,不可以设置默认值,字段为not null时手动指定字段;用now()变量自动插入系统当前时间;适合用于记录数据的原始创建时间,无论怎么更改记录中其它字段的,datetime...
  • 什么叫约束条件,约束条件...前2列是字段名和字段的类型,后4列都属于约束条件,每一列约束的条件都不一样NULL:代表的是允不允许为空,如果NULL里边的是YES,那就代表这个字段里边可以存空值,空就是没有数据,如...
  • 什么叫约束条件,约束条件...前2列是字段名和字段的类型,后4列都属于约束条件,每一列约束的条件都不一样NULL:代表的是允不允许为空,如果NULL里边的是YES,那就代表这个字段里边可以存空值,空就是没有数据,如...
  • 什么叫约束条件,约束条件...前2列是字段名和字段的类型,后4列都属于约束条件,每一列约束的条件都不一样NULL:代表的是允不允许为空,如果NULL里边的是YES,那就代表这个字段里边可以存空值,空就是没有数据,如...
  • alter table image alter column id int IDENTITY (1, 1) NOT NULL 我只能上查询分析器,所以只能这么该,对马,... 可以先加新的标识列,再设置允许修改标识列,再用原来的字段填充标识列,再删除原字段,
  • 此文件选择对话框是可以设置允许用户选择一个单独的文件或者是多个文件。 选择的的文件类型也是可以被限制的,因此用户只能选择指定的适当的文件,例如*.jgp;*.gif。 当选定文件以后,每个文件都会被验证和处理。...
  • /*设置响应头允许ajax跨域访问*/ response.setHeader("Access-Control-Allow-Origin", "*"); /* 星号表示所有的异域请求都可以接受, */ response.setHeader("Access-Control-Allow-Methods", "GET,POST");...
  • 这是我第一个Java比较完整项目(上课的那种小例子可以不算项目),学会了怎么用JDBC,学会了Java的一般程序模型(DAO层、JavaBean、监听层、服务层、视图层等),了解了一个软件的开发和维护。总之实训结束的时候我...
  • 8.4.4 当两个表达式相等的时候返回NULL值,否则返回第一个表达式 232 8.5 日期函数 233 8.5.1 返回当前日期和时间 233 8.5.2 在时区间进行转换 234 8.5.3 增加或减少日期值 235 8.5.4 找出两个日期的差 ...
  • 此规范内的算法在处理每个时都有一个关联的类型。可能的类型都定义在这个条款中。类型可以进一步分为 ECMAScript 语言类型和规范类型。 ECMAScript 语言类型和使用ECMAScript语言的程序员处理的相符。...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

允许null值怎么设置