精华内容
下载资源
问答
  • 用phpmyadmin查看你的数据库,设置为主键、选择唯一索引,是否允许重复与数据类型无关。   关键字UNIQUE把它定义为一个 唯一索引. 唯一性索引 和“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现...

    唯一索引 记录不重复设置

    用phpmyadmin查看你的数据库,设置为主键、选择唯一索引,是否允许重复与数据类型无关。

     

    关键字UNIQUE把它定义为一个唯一索引.唯一性索引 和“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。

     

    MySQL 普通索引、唯一索引和主索引

    1、普通索引

      普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

      2、唯一索引

      普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“ 员工个人资料”数据表里可能出现两次或更多次。

      如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理 工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

      3、主索引

      在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

      4、外键索引

      如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

      5、复合索引

      索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA,columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A,B,C)可以当做A或(A,B)的索引来使用,但不能当做B、C或(B,C)的索引来使用。

      6、索引的长度

      在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在绝大多数应用里,数据库中的字符串数据大都以各种各样的名字为主,把索引的长度设置为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。在为BLOB和TEXT类型的数据列创建索引时,必须对索引的长度做出限制;MySQL所允许的最大索引全文索引文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。

      这类场合正是全文索引(full-textindex)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:

      ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:

      SELECT*FROMtablename

      WHEREMATCH(column1,column2)AGAINST(‘word1','word2','word3’)

      上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。

      注解:InnoDB数据表不支持全文索引。
    展开全文
  • len() 是字符函数只能对字符型的才能查询, 如果字段为text类型,就能使用len()函数。不过可以使用 datalength()函数 2. 判断一个DataTable中的一个DataRow中的某一列为空值,能使用 if (Row....

    DataTabel中distinct

    在.NET Framework2.0中,选择DataTable等数据源中的唯一值(类似SQL中Distinct的返回结果)非常简单,如下即可:

    DataTable d = dataSetName.dataTableName.DefaultView.ToTable(true, new string[] { "ColumnName" });

    在.NET Framework1.0中,需要遍历,例如:

    object[] distinctRoomType = GetDistinctValues(dt,"Roomtype");
    Here is the method definition.
    public object[] GetDistinctValues(DataTable dtable,string colName)
    {
    Hashtable hTable = new Hashtable();
    foreach(DataRow drow in dtable.Rows)
    {
    try
    {
    hTable.Add(drow[colName],string.Empty);
    }
    catch{}
    }
    object[] objArray = new object[hTable.Keys.Count ];
    hTable.Keys.CopyTo(objArray,0);
    return objArray;
    }

     

     DataTable select()  的使用方法 

    1.

    len() 是字符函数只能对字符型的才能查询, 如果字段为text类型,就不能使用len()函数。不过可以使用  datalength()函数




    2.
    判断一个DataTable中的一个DataRow中的某一列为空值,不能使用
    if (Row.ItemArray[index]!=null) .........的形式

    需要使用DataRow类自带的一个函数IsNull。
    if(!DataRow.IsNull(index))

    在DataReader(如SqlDataReader)有相同功能的IsDBNull函数
    来源:(http://blog.sina.com.cn/s/blog_58de85690100cqp7.html) - 判断DataTable中某一行某列的数据为空值的办法(转)_孤风独语_新浪博客

    原因数据库列中的控制映射到.NET对象中是一个DBNull的对象。判断数据库列空值。办法有:
    if( DataRow.IsNull(index))
    if(Convert.IsDBNull(Row.ItemArray[index]))

     

     

    3.

     

     DataTable.Select("... 过滤表达式")

    string   tmp   =   "IsNull([fieldA],   ' ')   =   ' ' ";  //如果fieldA的值为空
    DataRow[]   rows   =   myDataTable.Select(tmp);


    在筛选器中可以使用下面这些语法

    在为筛选器创建表达式时,将字符串放到单引号中:
    "LastName   =   'Jones ' "
    下面的字符是特殊字符,如下面所解释的,如果它们用于列名称中,就必须进行转义:

    \n   (newline)
    \t   (tab)
    \r   (carriage   return)
    ~
    (
    )
    #
    \
    /
    =
    >
    <
    +
    -
    *
    %
    &
    |
    ^
    '
    "
    [
    ]

    如果列名称包含上面的字符之一,该名称必须用中括号括起来。例如,若要在表达式中使用名为“Column#”的列,应写成“[Column#]”:
    Total   *   [Column#]
    由于中括号是特殊字符,如果它是列名称的组成部分,必须使用斜杠   ( "\ ")   将中括号转义。例如,名为“Column[]”的列应写成:
    Total   *   [Column[\]]
    (只有第二个中括号必须转义。)

    用户定义的值

    用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号   (#)   内。对于数值,允许使用小数和科学记数法。例如:
    "FirstName   =   'John ' "
    "Price   <=   50.00 "
    "Birthdate   <   #1/31/82# "
    对于包含枚举值的列,将值强制转换为整数数据类型。例如:
    "EnumColumn   =   5 "

    运算符

    使用布尔值   AND、OR   和   NOT   运算符时允许串联。可以使用括号来组合子句和强制优先级。AND   运算符优先于其他运算符。例如:
    (LastName   =   'Smith '   OR   LastName   =   'Jones ')   AND   FirstName   =   'John '
    在创建比较表达式时,允许使用下列运算符:
    <
    >
    <=
    > =
    <>
    =
    IN
    LIKE
    在表达式中还支持下列算术运算符:
    +(加)
    -(减)
    *(乘)
    /(除)
    %(模数)

    字符串运算符

    若要连接字符串,请使用   +   字符。字符串比较是否区分大小写由   DataSet   类的   CaseSensitive   属性的值来确定。但是,可以用   DataTable   类的   CaseSensitive   属性重写此值。

    通配符

    在   LIKE   比较中,*   和   %   两者可以互换地作为通配符。如果   LIKE   子句中的字符串包含   *   或   %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如   [[]   或   []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头允许使用通配符。例如:
    "ItemName   LIKE   '*product* ' "
    "ItemName   LIKE   '*product ' "
    "ItemName   LIKE   'product* ' "
    在字符串的中间不允许使用通配符。例如,不允许   'te*xt '。

    父/子关系引用

    通过在列名称前面加   Parent,就可以在表达式中引用父表。例如,Parent.Price   引用父表的名为   Price   的列。
    通过在列名称前面加一个   Child,就可以在表达式中引用子表中的列。但是,因为子关系可以返回多行,所以必须在聚合函数中包括对子列的引用。例如,Sum(Child.Price)   将返回子表中名为   Price   的列的总和。
    如果某个表有多个子表,则语法是:Child(RelationName)。例如,如果某个表有两个子表,它们的名称分别为   Customers   和   Orders,则   DataRelation   对象被命名为   Customers2Orders,引用将为:
    Avg(Child(Customers2Orders).Quantity)

    聚合

    支持下列聚合类型:
    Sum(求和)
    Avg(平均)
    Min(最小值)
    Max(最大值)
    Count(计数)
    StDev(统计标准偏差)
    Var(统计方差)。
    聚合通常沿着关系执行。通过使用上面列出的函数之一和上面“父/子关系引用”中详述的子表列,来创建聚合表达式。例如:
    Avg(Child.Price)
    Avg(Child(Orders2Details).Price)
    聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,就用:
    Sum(Price)

    注意       如果使用一个表来创建聚合,将没有组合功能。相反,所有行都在列中显示相同的值。
    如果表没有行,聚合函数将返回空引用(Visual   Basic   中为   Nothing)。

    数据类型总是可以通过检查列的   DataType   属性来确定。还可以使用   Convert   函数来转换数据类型,如下所示。

    FUNCTIONS  

    还支持下列函数:

    CONVERT  
    描述   将给定表达式转换为指定的   .NET   Framework   类型。  
    语法   Convert(expression,   type)  
    参数   expression   —   要转换的表达式。  
    type   —   值将转换成的   .NET   Framework   类型。
     

    例如:myDataColumn.Expression= "Convert(total,   'System.Int32 ') "

    所有转换都是有效的,只有下列情况例外:Boolean   只能与   Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、String   和它本身相互转换。Char   只能与   Int32、UInt32、String   和它本身相互转换。DateTime   只能与   String   和它本身相互转换。TimeSpan   只能与   String   和它本身相互转换。

    LEN  

    描述   获取字符串的长度  
    语法   LEN(expression)  
    参数   expression   —   要计算的字符串。  

    例如:myDataColumn.Expression= "Len(ItemName) "

    ISNULL  

    描述   检查表达式并返回已检查的表达式或返回替换值。  
    语法   ISNULL(expression,   replacementvalue)  
    参数   expression   —   要检查的表达式。  
    replacementvalue   —   如果表达式为空引用   (Nothing),则返回   replacementvalue。
     

    例如:myDataColumn.Expression= "IsNull(price,   -1) "

    IIF  

    描述   根据逻辑表达式的结果,获取两个值之一。  
    语法   IIF(expr,   truepart,   falsepart)  
    参数   expr   —   要计算的表达式。  
    truepart   —   表达式为真时返回的值。

    falsepart   —   表达式为假时返回的值。
     

    例如:myDataColumn.Expression   =   "IIF(total> 1000,   'expensive ',   'dear ')

    TRIM  

    描述   移除所有前导的和后缀的空格字符,如\r、\n、\t、 '   '  
    语法   TRIM(expression)  
    参数   expression   —   要剪裁的表达式。  

    SUBSTRING  

    描述   获取从字符串中的指定点开始,具有指定长度的子字符串。  
    语法   SUBSTRING(expression,   start,  
    length)
     
    参数   expression   —   子字符串的源字符串。  
    start   —   指定子字符串开始位置的整数。

    length   —   指定子字符串长度的整数。
     

    例如:myDataColumn.Expression   =   "SUBSTRING(phone,   7,   8) "

     

    http://msdn.microsoft.com/zh-cn/library/system.data.datatable.defaultview(v=vs.80).aspx

    展开全文
  • len() 是字符函数只能对字符型的才能查询, 如果字段为text类型,就能使用len()函数。不过可以使用 datalength()函数 2. 判断一个DataTable中的一个DataRow中的某一列为空值,能使用 if (Row....

    DataTabel中distinct

    在.NET Framework2.0中,选择DataTable等数据源中的唯一值(类似SQL中Distinct的返回结果)非常简单,如下即可:

    DataTable d = dataSetName.dataTableName.DefaultView.ToTable(true, new string[] { "ColumnName" });

    在.NET Framework1.0中,需要遍历,例如:

    object[] distinctRoomType = GetDistinctValues(dt,"Roomtype");
    Here is the method definition.
    public object[] GetDistinctValues(DataTable dtable,string colName)
    {
    Hashtable hTable = new Hashtable();
    foreach(DataRow drow in dtable.Rows)
    {
    try
    {
    hTable.Add(drow[colName],string.Empty);
    }
    catch{}
    }
    object[] objArray = new object[hTable.Keys.Count ];
    hTable.Keys.CopyTo(objArray,0);
    return objArray;
    }

     

     DataTable select()  的使用方法 

    1.

    len() 是字符函数只能对字符型的才能查询, 如果字段为text类型,就不能使用len()函数。不过可以使用  datalength()函数




    2.
    判断一个DataTable中的一个DataRow中的某一列为空值,不能使用
    if (Row.ItemArray[index]!=null) .........的形式

    需要使用DataRow类自带的一个函数IsNull。
    if(!DataRow.IsNull(index))

    在DataReader(如SqlDataReader)有相同功能的IsDBNull函数
    来源:(http://blog.sina.com.cn/s/blog_58de85690100cqp7.html) - 判断DataTable中某一行某列的数据为空值的办法(转)_孤风独语_新浪博客

    原因数据库列中的控制映射到.NET对象中是一个DBNull的对象。判断数据库列空值。办法有:
    if( DataRow.IsNull(index))
    if(Convert.IsDBNull(Row.ItemArray[index]))

     

     

    3.

     

     DataTable.Select("... 过滤表达式")

    string   tmp   =   "IsNull([fieldA],   ' ')   =   ' ' ";  //如果fieldA的值为空
    DataRow[]   rows   =   myDataTable.Select(tmp);


    在筛选器中可以使用下面这些语法

    在为筛选器创建表达式时,将字符串放到单引号中:
    "LastName   =   'Jones ' "
    下面的字符是特殊字符,如下面所解释的,如果它们用于列名称中,就必须进行转义:

    \n   (newline)
    \t   (tab)
    \r   (carriage   return)
    ~
    (
    )
    #
    \
    /
    =
    >
    <
    +
    -
    *
    %
    &
    |
    ^
    '
    "
    [
    ]

    如果列名称包含上面的字符之一,该名称必须用中括号括起来。例如,若要在表达式中使用名为“Column#”的列,应写成“[Column#]”:
    Total   *   [Column#]
    由于中括号是特殊字符,如果它是列名称的组成部分,必须使用斜杠   ( "\ ")   将中括号转义。例如,名为“Column[]”的列应写成:
    Total   *   [Column[\]]
    (只有第二个中括号必须转义。)

    用户定义的值

    用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号   (#)   内。对于数值,允许使用小数和科学记数法。例如:
    "FirstName   =   'John ' "
    "Price   <=   50.00 "
    "Birthdate   <   #1/31/82# "
    对于包含枚举值的列,将值强制转换为整数数据类型。例如:
    "EnumColumn   =   5 "

    运算符

    使用布尔值   AND、OR   和   NOT   运算符时允许串联。可以使用括号来组合子句和强制优先级。AND   运算符优先于其他运算符。例如:
    (LastName   =   'Smith '   OR   LastName   =   'Jones ')   AND   FirstName   =   'John '
    在创建比较表达式时,允许使用下列运算符:
    <
    >
    <=
    > =
    <>
    =
    IN
    LIKE
    在表达式中还支持下列算术运算符:
    +(加)
    -(减)
    *(乘)
    /(除)
    %(模数)

    字符串运算符

    若要连接字符串,请使用   +   字符。字符串比较是否区分大小写由   DataSet   类的   CaseSensitive   属性的值来确定。但是,可以用   DataTable   类的   CaseSensitive   属性重写此值。

    通配符

    在   LIKE   比较中,*   和   %   两者可以互换地作为通配符。如果   LIKE   子句中的字符串包含   *   或   %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如   [[]   或   []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头允许使用通配符。例如:
    "ItemName   LIKE   '*product* ' "
    "ItemName   LIKE   '*product ' "
    "ItemName   LIKE   'product* ' "
    在字符串的中间不允许使用通配符。例如,不允许   'te*xt '。

    父/子关系引用

    通过在列名称前面加   Parent,就可以在表达式中引用父表。例如,Parent.Price   引用父表的名为   Price   的列。
    通过在列名称前面加一个   Child,就可以在表达式中引用子表中的列。但是,因为子关系可以返回多行,所以必须在聚合函数中包括对子列的引用。例如,Sum(Child.Price)   将返回子表中名为   Price   的列的总和。
    如果某个表有多个子表,则语法是:Child(RelationName)。例如,如果某个表有两个子表,它们的名称分别为   Customers   和   Orders,则   DataRelation   对象被命名为   Customers2Orders,引用将为:
    Avg(Child(Customers2Orders).Quantity)

    聚合

    支持下列聚合类型:
    Sum(求和)
    Avg(平均)
    Min(最小值)
    Max(最大值)
    Count(计数)
    StDev(统计标准偏差)
    Var(统计方差)。
    聚合通常沿着关系执行。通过使用上面列出的函数之一和上面“父/子关系引用”中详述的子表列,来创建聚合表达式。例如:
    Avg(Child.Price)
    Avg(Child(Orders2Details).Price)
    聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,就用:
    Sum(Price)

    注意       如果使用一个表来创建聚合,将没有组合功能。相反,所有行都在列中显示相同的值。
    如果表没有行,聚合函数将返回空引用(Visual   Basic   中为   Nothing)。

    数据类型总是可以通过检查列的   DataType   属性来确定。还可以使用   Convert   函数来转换数据类型,如下所示。

    FUNCTIONS  

    还支持下列函数:

    CONVERT  
    描述   将给定表达式转换为指定的   .NET   Framework   类型。  
    语法   Convert(expression,   type)  
    参数   expression   —   要转换的表达式。  
    type   —   值将转换成的   .NET   Framework   类型。
     

    例如:myDataColumn.Expression= "Convert(total,   'System.Int32 ') "

    所有转换都是有效的,只有下列情况例外:Boolean   只能与   Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、String   和它本身相互转换。Char   只能与   Int32、UInt32、String   和它本身相互转换。DateTime   只能与   String   和它本身相互转换。TimeSpan   只能与   String   和它本身相互转换。

    LEN  

    描述   获取字符串的长度  
    语法   LEN(expression)  
    参数   expression   —   要计算的字符串。  

    例如:myDataColumn.Expression= "Len(ItemName) "

    ISNULL  

    描述   检查表达式并返回已检查的表达式或返回替换值。  
    语法   ISNULL(expression,   replacementvalue)  
    参数   expression   —   要检查的表达式。  
    replacementvalue   —   如果表达式为空引用   (Nothing),则返回   replacementvalue。
     

    例如:myDataColumn.Expression= "IsNull(price,   -1) "

    IIF  

    描述   根据逻辑表达式的结果,获取两个值之一。  
    语法   IIF(expr,   truepart,   falsepart)  
    参数   expr   —   要计算的表达式。  
    truepart   —   表达式为真时返回的值。

    falsepart   —   表达式为假时返回的值。
     

    例如:myDataColumn.Expression   =   "IIF(total> 1000,   'expensive ',   'dear ')

    TRIM  

    描述   移除所有前导的和后缀的空格字符,如\r、\n、\t、 '   '  
    语法   TRIM(expression)  
    参数   expression   —   要剪裁的表达式。  

    SUBSTRING  

    描述   获取从字符串中的指定点开始,具有指定长度的子字符串。  
    语法   SUBSTRING(expression,   start,  
    length)
     
    参数   expression   —   子字符串的源字符串。  
    start   —   指定子字符串开始位置的整数。

    length   —   指定子字符串长度的整数。
     

    例如:myDataColumn.Expression   =   "SUBSTRING(phone,   7,   8) "

     

    http://msdn.microsoft.com/zh-cn/library/system.data.datatable.defaultview(v=vs.80).aspx

     

    展开全文
  • 本文主要讲述如何将日期选择字段修改日期时间选择字段

    都快一年没写过博客了,主要原因是各种忙,项目要忙,写书要忙,总之就是忙。忙有忙的好啊,忙意味着经验值又涨了,但离升级到下一等级估计还需要很长时间。在项目中的一些开发经验,已经总结到已经交稿的《Ext JS 6.2 实战》中,希望对大家有所帮助。由于一本书内容有限,因而有些东西还是得写写博客和大家交流。
    在Ext JS 4时代,很少考虑自己去改扩展之类的,因为在官方论坛一搜基本都有了。但随着Ext JS越来越商业化,这方面的东西越来越少了,很多时候只能自己动手了,今天要讲的日期时间字段就是这样,在Ext JS 4时代,一搜有好多,但Ext JS 6的没几个。还好,这么多年的使用经验在身,给点耐心,还是做出来了。
    要将日期字段(Ext.form.field.Date.html)修改为日期时间字段,关键的问题是如何将输入时间的INPUT元素插入到日期字段中。在最初的预想中,是直接将数字字段(Ext.form.field.Number)的HTML代码直接嵌入日期选择器(Ext.picker.Date)的模版中,经过试验,该方法是可行的,但要做的工作非常多,如为小时、分钟和秒的上、下按钮定义事件等等。
    在准备实现这是功能的时候,发现了以下很有趣的代码:

     beforeRender: function() {
            /*
             * days array for looping through 6 full weeks (6 weeks * 7 days)
             * Note that we explicitly force the size here so the template creates
             * all the appropriate cells.
             */
            var me = this,
                encode = Ext.String.htmlEncode,
                days = new Array(me.numDays),
                today = Ext.Date.format(new Date(), me.format);
    
            if (me.padding && !me.width) {
                me.cacheWidth();
            }
    
            me.monthBtn = new Ext.button.Split({
                ownerCt: me,
                ownerLayout: me.getComponentLayout(),
                text: '',
                tooltip: me.monthYearText,
                tabIndex: -1,
                ariaRole: 'presentation',
                listeners: {
                    click: me.doShowMonthPicker,
                    arrowclick: me.doShowMonthPicker,
                    scope: me
                }
            });
            if (me.showToday) {
                me.todayBtn = new Ext.button.Button({
                    ui: me.footerButtonUI,
                    ownerCt: me,
                    ownerLayout: me.getComponentLayout(),
                    text: Ext.String.format(me.todayText, today),
                    tooltip: Ext.String.format(me.todayTip, today),
                    tooltipType: 'title',
                    tabIndex: -1,
                    ariaRole: 'presentation',
                    handler: me.selectToday,
                    scope: me
                });
            }
    
            me.callParent();
    
            Ext.applyIf(me, {
                renderData: {}
            });
    
            Ext.apply(me.renderData, {
                dayNames: me.dayNames,
                showToday: me.showToday,
                prevText: encode(me.prevText),
                nextText: encode(me.nextText),
                todayText: encode(me.todayText),
                ariaMinText: encode(me.ariaMinText),
                ariaMaxText: encode(me.ariaMaxText),
                ariaDisabledDaysText: encode(me.ariaDisabledDaysText),
                ariaDisabledDatesText: encode(me.ariaDisabledDatesText),
                days: days
            });
    
            me.protoEl.unselectable();
        },

    在代码中,会发现月份按钮和今天按钮是使用Ext JS的按钮来实现的,而不是直接使用模版实现,也就是说,可以在模版中嵌入Ext JS的组件。这就好办了,把三个数字字段嵌入模版中就省事了,什么也不用干就基本实现了将时间输入字段嵌入到日期字段了。这个是怎么实现的呢?回头看看模版的定义代码:

       renderTpl: [
            '<div id="{id}-innerEl" data-ref="innerEl" role="presentation">',
                '<div class="{baseCls}-header">',
                    '<div id="{id}-prevEl" data-ref="prevEl" class="{baseCls}-prev {baseCls}-arrow" role="presentation" title="{prevText}"></div>',
                    '<div id="{id}-middleBtnEl" data-ref="middleBtnEl" class="{baseCls}-month" role="heading">{%this.renderMonthBtn(values, out)%}</div>',
                    '<div id="{id}-nextEl" data-ref="nextEl" class="{baseCls}-next {baseCls}-arrow" role="presentation" title="{nextText}"></div>',
                '</div>',
                '<table role="grid" id="{id}-eventEl" data-ref="eventEl" class="{baseCls}-inner" cellspacing="0" tabindex="0" aria-readonly="true">',
                    '<thead>',
                        '<tr role="row">',
                            '<tpl for="dayNames">',
                                '<th role="columnheader" class="{parent.baseCls}-column-header" aria-label="{.}">',
                                    '<div role="presentation" class="{parent.baseCls}-column-header-inner">{.:this.firstInitial}</div>',
                                '</th>',
                            '</tpl>',
                        '</tr>',
                    '</thead>',
                    '<tbody>',
                        '<tr role="row">',
                            '<tpl for="days">',
                                '{#:this.isEndOfWeek}',
                                '<td role="gridcell">',
                                    '<div hidefocus="on" class="{parent.baseCls}-date"></div>',
                                '</td>',
                            '</tpl>',
                        '</tr>',
                    '</tbody>',
                '</table>',
                '<tpl if="showToday">',
                    '<div id="{id}-footerEl" data-ref="footerEl" role="presentation" class="{baseCls}-footer">{%this.renderTodayBtn(values, out)%}</div>',
                '</tpl>',
                // These elements are used with Assistive Technologies such as screen readers
                '<div id="{id}-todayText" class="' + Ext.baseCSSPrefix + 'hidden-clip">{todayText}.</div>',
                '<div id="{id}-ariaMinText" class="' + Ext.baseCSSPrefix + 'hidden-clip">{ariaMinText}.</div>',
                '<div id="{id}-ariaMaxText" class="' + Ext.baseCSSPrefix + 'hidden-clip">{ariaMaxText}.</div>',
                '<div id="{id}-ariaDisabledDaysText" class="' + Ext.baseCSSPrefix + 'hidden-clip">{ariaDisabledDaysText}.</div>',
                '<div id="{id}-ariaDisabledDatesText" class="' + Ext.baseCSSPrefix + 'hidden-clip">{ariaDisabledDatesText}.</div>',
            '</div>',
            {
                firstInitial: function(value) {
                    return Ext.picker.Date.prototype.getDayInitial(value);
                },
                isEndOfWeek: function(value) {
                    // convert from 1 based index to 0 based
                    // by decrementing value once.
                    value--;
                    var end = value % 7 === 0 && value !== 0;
                    return end ? '</tr><tr role="row">' : '';
                },
                renderTodayBtn: function(values, out) {
                    Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);
                },
                renderMonthBtn: function(values, out) {
                    Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);
                }
            }
        ],
    

    在模版的定义代码中,是通过“{%this.renderMonthBtn(values, out)%}”和“{%this.renderTodayBtn(values, out)%}”将月份按钮和今天按钮渲染到模版的,查看这两个方法的代码,都是使用Ext.DomHelper.generateMarkup来返回HTML代码的,而在传递的参数中,是通过values.$comp来获取组件的,再调用组件的getRenderTree方法来返回一些东西。具体的细节就不细究了,知道如何去使用就行了。
    总结一下,要在模版中渲染Ext JS的组件的基本流程就是在beforeRender方法中创建组件,然后在模版中调用方法进行渲染。了解了这个基本流程,就好办了。
    在试验阶段,先把日期选择器的代码全部复制过来,先根据这个实现了,再考虑从日期选择器继承的问题。日期选择器的代码复制后,先在beforeRender方法内创建3个数字字段。由于数字字段有些配置项是相同的,要把这些相同的配置项做成一个属性来调用,避免重复写这些代码,代码如下:

        numberFieldDefaults: {
            allowBlank: false,
            allowDecimals: false,
            width: 92,
            maxLength: 2,
            autoStripChars: true,
            ariaRole: 'presentation',
            enforceMaxLength: true
        },

    在配置项中,包括了数字字段不允许为空、不允许输入小数、宽度为92、字符最多是2个、自动去掉不符合要求的字符以及强迫实施最大长度策略。那个ariaRole是在定义月份按钮和今天按钮中都带有的,也就带上了。字段的宽度是根据实际效果试出来的。
    接下来是创建数字字段,代码如下:

            me.hourField = new Ext.form.field.Number(Ext.apply({
                ownerCt: me,
                ownerLayout: me.getComponentLayout(),
                maxValue: 23,
                minValue: 0
            }, me.numberFieldDefaults));
    
            me.minuteField = new Ext.form.field.Number(Ext.apply({
                ownerCt: me,
                ownerLayout: me.getComponentLayout(),
                maxValue: 59,
                minValue: 0
            }, me.numberFieldDefaults));
    
            me.secondField = new Ext.form.field.Number(Ext.apply({
                ownerCt: me,
                ownerLayout: me.getComponentLayout(),
                maxValue: 59,
                minValue: 0
            }, me.numberFieldDefaults));

    配置项ownerCt和ownerLayout也是定义月份按钮和今天按钮是带有的,就顺手了。这两个配置项是指定拥有者和拥有者布局的。余下的就是各数字字段允许的输入值了。
    在使用公共配置项的时候,建议的做法是使用Ext.apply方法复制一份,不然创建的实例就都和公共的配置对象关联起来了,很容易出问题。
    接下来是修改模版定义了,在显示日期的TABLE元素和渲染今天按钮之间的代码直接插入以下代码来渲染数字字段:

    '<table role="grid" class="{baseCls}-footer" role="presentation" cellspacing="0" tabindex="0">',
    '<tr>',
    '<td style="width:102px;padding:5px">{%this.renderHourField(values, out)%}</td>',
    '<td style="width:104px;padding:6px">{%this.renderMinuteField(values, out)%}</td>',
    '<td style="width:102px;padding:5px">{%this.renderSecondField(values, out)%}</td>',
    '</tr>',
    '</table>',

    代码中使用TABLE元素是为了布局方便,如果不喜欢,可自行修改为DIV元素,并设置相应的样式。这个TABLE元素是参考日期显示的TABLE元素写的。中间的单元格的宽度为104像素,是因为整个日期选择器的宽度是308,要平均分为三分分不了,只能将中间的单元格的宽度设置大点。
    模版添加好了,还要为模版添加renderHourField、renderMinuteField和renderSecondField这三个方法,代码如下:

    renderHourField: function (values, out) {
        Ext.DomHelper.generateMarkup(values.$comp.hourField.getRenderTree(), out);
    },
    renderMinuteField: function (values, out) {
        Ext.DomHelper.generateMarkup(values.$comp.minuteField.getRenderTree(), out);
    },
    renderSecondField: function (values, out) {
        Ext.DomHelper.generateMarkup(values.$comp.secondField.getRenderTree(), out);
    }

    下面的工作是在代码中搜索todayBtn属性,看看创建今天按钮后, 还有那些工作要做,是否时间的数字字段也需要做这些工作。从文件顶部开始搜索,跳过模版代码后,会转到getRefItems方法内,根据API中的描述,这个方法是用来创建组件树,用来实现组件查询的,这个不能少,需要将时间的数字字段添加到里面,代码如下:

        getRefItems: function () {
            var results = [],
                monthBtn = this.monthBtn,
                todayBtn = this.todayBtn,
                hourField = this.hourField,
                minuteField = this.minuteField,
                secondField = this.secondField;
    
            if (monthBtn) {
                results.push(monthBtn);
            }
    
            if (todayBtn) {
                results.push(todayBtn);
            }
    
            if (hourField) {
                results.push(hourField);
            }
    
            if (minuteField) {
                results.push(minuteField);
            }
    
            if (secondField) {
                results.push(secondField);
            }
    
            return results;
        },

    继续搜索,跳过beforerender方法后,来到了selectToday方法,这里只是引用了今天按钮,可以跳过,继续搜索。接下来是fullupdate方法,这里只是禁用按钮,可以继续搜索。接下来是doDestroy方法,是用来销毁按钮的,这里要加入销毁操作,代码如下:

        doDestroy: function () {
            var me = this;
    
            if (me.rendered) {
                Ext.destroy(
                    me.keyNav,
                    me.monthPicker,
                    me.monthBtn,
                    me.nextRepeater,
                    me.prevRepeater,
                    me.todayBtn,
                    me.hourField,
                    me.minuteField,
                    me.secondField,
                    me.todayElSpan
                );
            }
    
            me.callParent();
        },

    最后,就剩finishRenderChildren方法和syncDisabled方法了。根据方法的注释,finishRenderChildren方法是用来实现容器的布局操作的,根据对Ext JS的理解,容器的布局操作基本上就是用来调整子组件的位置和大小,估计和这个的工作差不多。再查下finishRender方法的API,发现该方法会以从上到下的顺序来访问组件树,该方法会在子组件运行该方法之前运行。不太好理解这个是干什么的。但后面那句话就容易理解多了,该方法会调用每一个组件的onReder方法,也就是说,这个是用来实现组件渲染的,因而必须在finishRenderChildren方法内添加时间的数字字段的代码:

    finishRenderChildren: function () {
        var me = this;
    
        me.callParent();
        me.monthBtn.finishRender();
        me.hourField.finishRender();
        me.minuteField.finishRender();
        me.secondField.finishRender();
        if (me.showToday) {
            me.todayBtn.finishRender();
        }
    },

    这里有没有一个顺序问题?没细究,反正根据渲染顺序写就是了。
    最后的syncDisabled方法是用来实现同步禁用,对于时间的数字字段不需要这东西。
    现在,时间的数字字段显示是没问题了,但是没有初始值,在initComponent方法内,会看到以下代码:

    me.value = me.value ? clearTime(me.value, true) : clearTime(new Date());

    居然在设置初始值时,调用Ext.Date的clearTime方法把时间都抹去了,这当然是不行的,改:

    me.value = me.value || new Date();

    在文件内搜索clearTime方法,在setValue方法内找到了一个,这个要改:

        setValue: function (value) {
            // If passed a null value just pass in a new date object.
            this.value = value || new Date();
            return this.update(this.value);
        },

    在selectToday方法有,该方法是用来实现选择日期后设置值的,要改:

    me.setValue(new Date());

    在fullupdate方法内也有,但是这里不能改。日期选择器在实现日期选择时,为了能确定单击某个元素后的日期值,特意将日期值(不包括时间)转换为(getTime方法的返回值)从1970年1月1日开始计算到日期值的时间之间的毫秒数,并作为元素的dataValue属性的值,这样,在获取到元素后,通过dataValue就可知道日期值了。如果把这里的clearTime清除,由于带有时间值,在最后的日期值判断上会出现问题,因而不建议修改。如果是完美主义者,也可以修改,但这需要点耐心,把需要修改的地方都修改好了,保证获取日期值不会出问题。

    清理完clearTime方法后,时间值还是没有,这是因为没有给时间字段赋值。对于字段来说,一般的赋值都是在setValue方法里实现的,因而,在setValue方法内添加以下代码来实现时间字段的赋值:

            me.hourField.setValue(date.getHours());
            me.minuteField.setValue(date.getMinutes());
            me.secondField.setValue(date.getSeconds());

    不过这招不好使,经测试,初始化的时候不会执行setValue方法。这只能耐心去研究初始化过程了。先从initComponent方法开始,这里只执行了initDisabledDays方法。在initDisabledDays方法内并没有执行初始化工作,也没有调用其他方法,因而不是在这里执行初始化的。接下来是beforeRender方法,渲染前执行的方法,这里只是执行了组件的初始化,不是这里。接下来是onRender方法,渲染时执行的方法,也没看到初始化值的操作。接下来是initEvents方法,在这里绑定了一堆事件后,调用了update方法。在update方法内调用了selectedUpdate和fullUpdate方法。根据注释,selectedUpdate方法是更新已选择的单元格的,并没有初始化值。在fullUpdate方法,刚才已经接触过了,是用来初始化日期列表,在最后还调用了me.monthBtn.setText方法来更新月份按钮的文本,看来,这里就是用来初始化值的地方了,把上面用来初始化时间的代码放这里试试,居然行了,那没问题了。

    余下的问题就是返回值的问题了,日期下拉选择字段是通过监听日期选择器的select事件来获取返回值的,因而,在代码中,找到触发select事件的代码,并修改返回值就行了。在这里查找fireEvent会比查找select来得方便。
    从文件顶部通过搜索fireEvent,首先会定义为handleTabKey方法,代码如下:

        handleTabKey: function(e) {
            var me = this,
                t = me.getSelectedDate(me.activeDate),
                handler = me.handler;
    
            // The following code is like handleDateClick without the e.stopEvent()
            if (!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)) {
                me.setValue(new Date(t.dateValue));
                me.fireEvent('select', me, me.value);
                if (handler) {
                    Ext.callback(handler, me.scope, [me, me.value], null, me, me);
                }
                me.onSelect();
            }
            // Even if the above condition is not met we have to let the field know
            // that we're tabbing out - that's user action we can do nothing about
            else {
                me.fireEventArgs('tabout', [me]);
            }
        },

    从代码可以看到,它会先调用setValue方法将元素绑定的日期值设置为选择器的值,然后返回。由于dataValue值是并不包含时间字段的时间值,必须将这个加回去,修改后的代码如下:

        handleTabKey: function(e) {
            var me = this,
                t = me.getSelectedDate(me.activeDate),
                handler = me.handler,
                value ;
    
            // The following code is like handleDateClick without the e.stopEvent()
            if (!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)) {
                //me.setValue(new Date(t.dateValue));
                value =  new Date(t.dateValue);
                me.setValue(new Date(value.getFullYear(),value.getMonth(), value.getDate(), me.hourField.getValue(), me.minuteField.getValue(), me.secondField.getValue() ));
                me.fireEvent('select', me, me.value);
                if (handler) {
                    Ext.callback(handler, me.scope, [me, me.value], null, me, me);
                }
                me.onSelect();
            }
            // Even if the above condition is not met we have to let the field know
            // that we're tabbing out - that's user action we can do nothing about
            else {
                me.fireEventArgs('tabout', [me]);
            }
        },

    主要修改地方是将调用setValue方法时,把时间字段的时间添加到日期中。为什么不在setValue方法里修改呢?这是因为,如果在setValue方法里修改,当调用setValue方法来赋值时,这时候的时间字段的值并不一定是赋值时的时间值,这样就会出现用当前的时间字段值替换了赋值时的时间值。

    在测试时,会出现t.dateValue是undefined的错误,原因是getSelectedDate方法未能正确返回日期节点,而造成这个的主要原因是由于现在的日期值是带时间的,找节点时需要提供不带时间的日期值,因而需要在getSelectedDate方法内,将以下语句:

    t = date.getTime()

    修改为:

    t = Ext.Date.clearTime(date,true).getTime(),

    这样,就能正确找到对应日期的节点了。

    继续搜索fireEvent,会在handleDateClick方法内找到select事件的触发,修改方式与修改handleTabKey一样。修改后,会发现选中的日期并没有高亮显示。经排查后,发现在selectedUpdate方法内,造成这个问题的主要原因与getSelectedDate方法的原因是一样的,将日期值清楚时间后,再调用getTime方法就没有问题了。

    继续搜索fireEvent,会在selectToday方法内找到select事件,在这里,将“me.setValue(Ext.Date.clearTime(new Date()));”修改为不清理时间的日期值就行了。

    在选择月份后,会重新设置一次日期,这里也需要修改,具体代码如下:

        onOkClick: function(picker, value) {
            var me = this,
                month = value[0],
                year = value[1],
                date = new Date(year, month, me.getActive().getDate(),me.hourField.getValue(), me.minuteField.getValue(), me.secondField.getValue());
    
            if (date.getMonth() !== month) {
                // 'fix' the JS rolling date conversion if needed 
                date = Ext.Date.getLastDateOfMonth(new Date(year, month, 1,me.hourField.getValue(), me.minuteField.getValue(), me.secondField.getValue()));
            }
            me.setValue(date);
            me.hideMonthPicker();
        },    

    至此,日期时间选择字段就已经完成了。

    展开全文
  • 字段类型与合理的选择字段类型

    千次阅读 2017-01-12 23:04:26
    本篇博客稍微有点长,它实际上包括两个内容:一是mysql字段类型的...许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或
  • 1.建议每个字段都设置上NOT NULL属性,可减少存储开销以及避免排序准确的问题。2.在count计算中,count(*) 会统计NULL的行, count(列名)不会统计此列为NULL值的行。count(distinct col) 计算该列除 NULL ...
  • 解决mysql连表查询别名起作用,同名的字段只能显示其中一个字段值。 标签: javajdbchibernatemysql 2016-03-17 13:47 1252人阅读 评论(1) 收藏 举报 分类: 问题记(4) 作者...
  • Django中models文件中的字段

    千次阅读 2017-08-20 01:55:19
    你通常需要直接使用这个字段;如果你指定主键的话,系统会自动添加一个主键字段到你的model。 BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 CharField:字符串字段,单行输入,用于较短的字符...
  • MySQL 字段类型

    千次阅读 2018-06-19 21:08:56
    值得注意的是---无论数值还是字符,这些类型的子类是字节,它们的不同仅仅... MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。INT在 MySQL 中支持的 5 个主要整数类型是 TINYIN...
  • 数据库字段属性和索引

    千次阅读 2019-07-05 23:30:25
    主键:primary key ,主要的键,一张表只能有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,重复,这种称之为主键。 1.增加主键 SQL操作中有多种方式可以给表增加主键:大体分为三种 方案1:在...
  • Django数据库字段类型(Field types) AutoField class AutoField(**options) 它是一个根据 ID 自增长的 IntegerField 字段。通常,你不必直接使用该字段。如果你没在别的字段上指定主键,Django 就
  • Django model字段类型详解

    千次阅读 2016-04-05 10:45:54
    Django 通过 models ...你通常需要直接使用这个字段;如果你指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段)   BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 ...
  • SQL字段约束

    千次阅读 2018-12-01 20:55:54
     primary key ,约束表数据唯一性,一张表只可有一个主键,但可以有复合主键,主键字段本身为空  1.1增加主键  创建表的时间字段属性加上primary key [not null] comment;  name varchar(10) primary key ...
  • 我遇到的问题: 1.在CDM里建模型的时候,如果多个表里包含同名的字段,则该字段在一个表里被修改,则在所有...1.在PDM里存在CDM里的问题,不仅不同表里的同名字段没有连动关系,而且还可以用同名字段做主键。爽!
  •  第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。   没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就...
  • django model 的字段以及字段属性

    千次阅读 2017-05-20 21:24:54
    一个自增的IntegerField,一般直接使用,Django会自动给每张表添加一个自增的primary key。2、BigIntegerField 64位整数, -9223372036854775808 到 9223372036854775807。默认的显示widget 是 TextInput.3、...
  • Django 模型字段参考

    千次阅读 2016-10-28 11:19:05
    更多请查看原文:Django 1.8.2 文档字段选项(Field options)下列参数是全部字段类型都可用的,而且都是可选择的。nullField.null 如果为True,Django 将空值以NULL 存储到数据库中。默认值是 False。字符串字段例如...
  • SQL数据库字段数据类型说明

    千次阅读 2018-03-15 23:23:47
    SQL数据库常用字段数据类型说明这里先总结数据类型。MySQL中的数据类型大的方面来分,可以分为:日期和时间、数值,以及字符串。下面就分开来进行总结。日期和时间数据类型MySQL数据类型含义date3字节,日期,格式:...
  • Mysql字段类型与合理选择

    千次阅读 2018-07-26 11:54:21
    许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。 INT 在 MySQL 中支持的 5 个主要...
  • 比如:我指以数字组成定长度为10以内的字符串,指定不允许连续6个数字及以上通过 1233444444 这个让通过 1433333332 这个让通过 1531224154 这个让通过 4135353331 这个让通过 要求:不用预查功能,因为用的...
  • Django model字段类型清单

    千次阅读 2016-04-26 18:06:58
    Django 通过 models 实现...你通常需要直接使用这个字段;如果你指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 CharF
  • Django models 字段类型 models.AutoField 作用说明:默认生成列名为 id 的列,并设置为主键 数据类型:int(11) 必备参数:primary_key = True 作为主键存在 ColName = models.AutoField(primary_key = True) ...
  • MYSQL的所有字段使用大全,必读,身藏 1.mysql的数值类型 列类型 需要的存储量  TINYINT 1 字节  SMALLINT 2 个字节  MEDIUMINT 3 个字节  INT
  • SQLServer用SQL语句给字段设置约束

    千次阅读 2020-12-26 20:45:47
    主键约束(primary):不允许元素重复,元素必须是唯一的,有效的避免了数据的冗余。 外键约束(foreign):通过外键约束从语法上保证了本事物所关联的其他事情一定是存在的,且事物与事物之间的关系是通过外键来体现的
  • django models 之字段详解

    千次阅读 2018-08-10 12:15:55
    数据库模型是django操作数据库的主要途径,也是django和数据库连接的主要方法,几乎所有对数据库的操作都是通过models来完成的,下面我们就简单介绍一下创建模型时会涉及到的字段类型,以及字段设置的含义 ...
  • arcgis中字段的说明

    万次阅读 2017-03-22 16:55:02
    创建要素类和表时,请为各字段选择数据类型。可用的类型包括多种数字类型、文本类型、日期类型、二进制大对象 (BLOB) 或全局唯一标识符 (GUID)。选择正确的数据类型可以正确存储数据,并且便于分析、数据管理和满足...
  • Django Model层字段类型详解

    千次阅读 2016-01-13 23:45:29
    Django Model层字段类型详解  字段选项 以下参数适用于所有字段类型。所有这些都是可选的。 null Field.null 如果为True,Django将在数据库中存储空值NULL,默认是False。 需要注意的...
  • 数据仓库基本知识

    万次阅读 多人点赞 2017-10-31 17:35:04
    第二阶段,流量来了,客户和订单都多起来了,普通查询已经有压力了,这个时候就需要升级架构变成多台服务器和多个业务数据库(量大+分分表),这个阶段的业务数字和指标还可以勉强从业务数据库里查询。初步进入...
  • Mysql 字段类型分析

    万次阅读 2013-02-22 13:21:08
    mysql建表初步知识及字段类型 一、如何登录phpMyAdmin环境  phpMyAdmin可以对mysql数据库进行完全管理。在IE地址中输入地址,输入数据库帐号和密码,登录phpMyAdmin。 二、几个概念 1、数据库:在...
  • Django 数据模型字段及属性

    千次阅读 2017-05-02 21:57:56
    本文介绍了Django模型常用的字段类型及参数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,465
精华内容 39,386
关键字:

不允许重复数字库字段