代理键
A. surrogate keys在sql中是什么意思
在SQL Server代理键是表中的每一行的唯一标识符。这仅仅是一个键。使用此键,我们可以找出一个唯一的行。没有业务含义为代理键。这种类型的关键是产生或通过其他应用程序(而不是由用户自备)产生的任何数据库。
Surrogate Key 的关键是为每个行只是唯一的标识符,它可能会作为主键使用。存在对替代主密钥,它是每个行必须具有该列的唯一值的唯一要求。代理键也被称为人工键或身份键。它可以在数据仓库中。
A Surrogate Key should have the following characteristics:
•Unique Value
•The key is generated by the system, in other words automatically generated
•The key is not visible to the user (not a part of the application)
•It is not composed of multiple keys
•There is no semantic meaning of the key
一般来说,Surrogate Key 的关键是SQL Server或数据库本身产生了连续的唯一编号。代理键的purpsoe是作为主键。有一个代理键和主键之间的细微差别。理想情况下,每一行既有主键和代理键。主键标识数据库中的唯一行,而代理键标识模型中的唯一实体。
http://www.c-sharpcorner.com/UploadFile/ff2f08/surrogate-key-in-sql-server/
http://www.sql-server-performance.com/2014/natural-surrogate-keys/
B. 求教如何中控控制智能电视开关机,通过网络命令唤醒和关闭电视,求解决方案,酬劳400元,万分感谢!
更换带红外功能的手机,使用万能遥控器功能配对出你电视的遥控器,按下遥控器的电视代理键即可达到你喜欢的绝对控制效果。
钱就不用,采纳即可。
C. 数据仓库 代理键 使用方法
我看到你的模型设计实际上没有考虑历史数据。要考虑到历史数据,你的相关表结构需要一些变化。
事实表的结构需要变更为:
statis_month userid(主) bid deptid pay
200901 1 1 301 50
200901 2 2 302 30
200901 3 2 302 40
200901 4 3 303 15
200901 1 1 301 50
200901 2 4 302 30
200901 3 4 302 40
200901 4 3 303 15
我理解代理键实际是反应了仓库中维度表的变更历史。
例如,你提到的维度表可能发生如下变化
bid(代) deptid deptname groupid groupname 状态 最后状态日期
1 301 销售一部 1 销售区 失效 200901
2 302 销售二部 1 销售区 在用 200901
3 303 市场一部 2 市场区 在用 200901
4 302 销售二部 2 市场区 在用 200902
D. 如何用代理键实现 DB2 UDB 主键
本文描述了三种实现: 使用传统方法。使用键管理器。使用DB2 UDB 特性。代理键也叫 内键(internal key)。当创建一个表时,可以添加一个额外的列作为代理键。这个列应该是 NOT NULL,并且没有商业意义。可以将该代理列指定为主键列。例如可以有一个数字代理列。代理键的值从某一个数字开始,例如 "1",以这个数字作为该列在表中第一行的值,之后的每一行中该列的值都按 1 递增。 例如,如果我们有表 EMPLOYEE: CREATE TABLE EMPLOYEE ( FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2)) 那么可以添加一个代理键列 SERIALNUMBER,并将其指定为主键列。这样,这个表的定义就变为: CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那么,怎样将惟一的值赋给每一行的 SERIALNUMBER 列呢?首先需要为代理键生成惟一的值。下面我将讨论三种可行的解决方案。回页首使用传统方法解决方案的思想传统方法是使用简单的 SQL 或触发器生成惟一的值。示例以表EMPLOYEE 为例。您可以在 INSERT 语句中实现代理键生成函数: INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES ((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1, ‘John’, ‘Smith’, 999.99) SQL 语句 " (SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1 " 将找出最大的 SERIALNUMBER 并将其加 1,这样新行就有一个惟一的 SERIALNUMBER。 这样做存在的一个问题是,当将第一行插入表中时,可能会得到如下错误: SQL0407N Assignment of a NULL value to a NOT NULL. SQLSTATE=23502. 得到上述错误的原因是,当表为空时," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 的返回为 NULL。因此,我们必须使用 COALESCE() 来处理这个问题: INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES (COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1, ‘John’, ‘Smith’, 999.99) 另一种传统方法是使用触发器来生成代理键: CREATE TRIGGER AUTOSURROGATEKEY NO CASCADE BEFORE INSERT ON EMPLOYEE REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SET N.SERIALNUMBER = COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1; END 优点及问题传统方法易于理解,而且容易在所有系统上实现。但是,这种实现实际上会导致事务处理系统中出现并发问题。因为该实现只允许一次执行一条 INSERT 操作。 因此,在获得最大的 SERIALNUMBER 之前," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 必须等待其他所有事务完成对表 EMPLOYEE 的 INSERT 或 UPDATE 操作。例如,如果有两个事务正在对 EMPLOYEE 表进行 INSERT 操作,那么其中有一个事务会被另一个事务阻塞。显然,这种“逐次插入”的解决方案不适合多用户的事务处理系统。 回页首使用键管理器解决方案的思想很多大型的应用程序使用键管理器方法维护所有表的代理键。键管理器可以是一个助手类。每当需要向表插入一个行时,便可以调用键管理器生成新的键值,然后将获得的键值插入新行。示例首先,需要创建表 KEYS 来记录每个表的当前代理键值。键管理器类将使用该表生成新键值。 CREATE TABLE KEYS ( TABLENAME CHAR(256), COLNUMNAME CHAR(256), SURROGATEKEYVALUE BIGINT, INCREMENT BIGINT, PRIMARY KEY(TABLENAME, COLNUMNAME)); 第二,将新表(例如表 EMPLOYEE)注册到表 KEYS 中。 INSERT INTO KEYS (TABLENAME, COLUMNNAME, SURROGATEKEYVALUE, INCREMENT) VALUES (‘EMPLOYEE’, ‘SERIALNUMBER’, 0, 1); 第三,编写 KeyManger 类来维护每个已注册表的代理键。KeyManager 将提供两个方法: /** *Intialize the KeyManger */ KeyManager.singleton(); /** *Return the unique surrogate key value according to the input table *name and column name. */ KeyManager. GetSurrogateKey(String tableName, String columnName); 要查看更详细的 KeyManger 的代码,请参考附录。 第四,调用 KeyManger 来获得主键值: … KeyManager km = KeyManager.singleton(); Long surrogateKey = km.getSurrogateKey("EMPLOYEE", "SERIALNUMBER"); … 优点和问题显然,键管理器是模块化设计的一个很好的例子。键管理器封装了代理键生成函数。这种实现也易于定制。您可以在 KEYS 表中为 SURROGATEKEYVALUE 或 INCREMENT 指定不同的值,以得到不同的代理键。而且,这种实现可以在大多数数据库系统上实施。但是,为了进行维护,需要一个单独的表和编写代码。所以,这种方法更适合于大型的跨数据库系统。 回页首使用DB2 UDB 特性DB2 UDB 提供了三种方法来生成惟一值。您可以使用这些方法来实现代理键。DB2 UDB Version 6.1 中的 GENERATE_UNIQUE() SQL 函数。 DB2 UDB Version 7.2 中 CREATE TABLE 语句的 IDENTITY 选项。DB2 UDB Version 7.2 中的 SEQUENCE 对象。 GENERATE_UNIQUE()解决方案的思想GENERATE_UNIQUE() 最初是在 DB2 UDB Version 6.1 中提供的一个 SQL 函数。该函数返回当前系统时间戳。我们可以使用该函数为代理键列生成惟一值。示例 CREATE TABLE EMPLOYEE ( SERIALNUMBER CHAR(13) FOR BIT DATA NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然后可以用下面的 SQL 语句插入一行: INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(GENERATE_UNIQUE(), ‘John’, ‘Smith’, 999.99) 优点和问题这里需要清楚两件事情。首先,当多个事务在同一时刻插入行时,GENERATE_UNIQUE() 可能会返回相同的时间戳。在这种情况下,GENERATE_UNIQUE() 不能为每个事务生成一个惟一的返回值,因而这种方法不适合有大量事务的系统。第二,一旦系统时钟需要向后调整,那么 GENERATE_UNIQUE() 将可能返回重复的值。 由于上述限制,我决不会在生产系统中使用 GENERATE_UNIQUE()。但是,当您需要在有限的时间内完成一个原型时,这也许是一种选择。 CREATE TABLE 语句中的 IDENTITY 选项解决方案的思想IDENTITY 是 DB2 UDB Version 7.1 和后期版本提供的 CREATE TABLE 语句中的一个选项。在创建表时,可以将某个列指定为 IDENTITY 列。对于每条 INSERT 语句,DB2 将负责为其中的这一列生成一个惟一的值。 示例 CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然后可以用下面的语句插入一行: INSERT INTO EMPLOYEE (FIRSTNAME, LASTNAME, SALARY) VALUES ( ‘John’, ‘Smith’, 999.99) INSERT 语句不需要指定 SERIALNUMBER 列的值。DB2 UDB 将根据列的定义自动生成惟一值,即 "GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)"。优点和问题IDENTITY 函数在大多数情况下是代理键函数的一个好的解决方案。DB2 import 和 export 实用程序也支持 IDENTITY 选项。然而,在某种情况下,这种解决方案不大方便。在运行 INSERT 语句之后,应用程序将永远都不知道放入了主键列中的是什么值。如果应用程序必须继续向子表插入一个行,那么它就不得不对父表运行一条 SELECT 语句,以得到主键值。不过,如果这一点对于您的系统不成问题的话,那么使用 IDENTITY 选项是一个好主意。 SEQUENCE 对象解决方案的思想SEQUENCE 对象是在 DB2 UDB Version 7.2 中引入的一个特性。用户可以在数据库中创建一个 SEQUENCE 对象,就像创建表对象或视图对象一样,然后从 SEQUENCE 中请求值。DB2 保证用户每次可以得到一个惟一的序列值。 示例您可以在数据库中创建一个 SEQUENCE 对象: CREATE SEQUENCE EMPSERIAL AS BIGINT START WITH 1 INCREMENT BY 1 如果有一个如下所示的 EMPLOYEE 表: CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那么可以用下面的语句插入一个行: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'John', 'Smith', 99.99) 在这里使用 " NEXTVAL FOR EMPSERIAL " 从 SEQUENCE 中获得惟一值。 您可以使用 " PREVVAL FOR EMPSERIAL " 获得当前连接会话中最近生成的序列值。应用程序就可以知道放入主键列中的是什么值,从而继续向子表插入一个行。这里,“在当前连接会话中”这一点很重要,这意味着 "PREVVAL" 将只返回在相同连接会话中生成的值。 例如,考虑这样的情况:有两个应用程序连接到数据库,并按照如下顺序运行下面的 SQL 语句。 (假设 SEQUENCE " EMPSERIAL " 的当前值是 3)。 应用程序 1: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Martin', 'Wong', 1000.00)从EMPSERIAL 生成的 " NEXTVAL " 是 4。 应用程序 2: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Patrick', 'Chan', 99.99) 从EMPSERIAL 生成的 " NEXTVAL " 是 5。 应用程序 1: SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE " PREVVAL " 将返回 4,而不是 5。 而且, PREVVAL 和NEXTVAL 的值不会受事务回滚的影响。 例如,假设 SEQUENCE " EMPSERIAL " 的当前值是 30。某个应用程序开始了一个事务: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'William', 'Chen', 99.99) 执行ROLLBACK 操作。 然后,如果运行: SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE 则" PREVVAL " 将返回 31,而不是 30。 优点和问题SEQUENCE 是最近 DB2 UDB 为生成惟一值而实现的函数。它还有一个缓存函数,用于提高性能(要了解详细信息,请参阅 IBM DB2 UDB SQL Reference)。该函数比 IDENTITY 函数更灵活,因为它是数据库中的一个独立对象。必要时候,可以通过运行 ALTER SEQUENCE 语句更改其设置。 如果系统只在 DB2 UDB 上运行,那么 SEQUENCE 也许是最好的解决方案,因为它易于使用,而且不像键管理器那样需要额外的代码,并且可以随需求的变化很轻易对其进行更改。回页首结束语本文描述了实现作为主键的代理键的三种方法。文中主要讨论了如何为代理键生成惟一的序列值。传统方法适合于简单的、单用户(非并发)系统。对于实现对于大型系统和跨平台系统,键管理器是一个好选择。但是,如果项目只在 DB2 UDB 上运行的话,可以考虑 DB2 UDB 提供的特性。IDENTITY 和 SEQUENCE 函数提供了一种容易的、灵活的解决方案。在创建 IDENTITY 列和 SEQUENCE 对象时,可以使用很多选择。请参阅 IBM DB2 UDB Administration Guide和IBM DB2 UDB SQL Reference,以获得完整的细节。 回页首附录 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class KeyManager { private static KeyManager singleton; private PreparedStatement getKeyStmt = null; private PreparedStatement updateKeyStmt = null; static final String db2Driver = "COM.ibm.db2.jdbc.app.DB2Driver"; static final String db2UrlPfx = "jdbc:db2:"; public KeyManager Singleton() throws ClassNotFoundException, SQLException{ if (singleton == null) { if (singleton == null) singleton = new KeyManager(); } return singleton; } private KeyManager() throws ClassNotFoundException, SQLException{ Class.forName(db2Driver); Connection connection = DriverManager.getConnection(db2UrlPfx+ "dbName", "userName", "password"); getKeyStmt = connection.prepareStatement("SELECT SURROGATEKEYVALUE FROM KEYS WHERE TABLENAME = ? AND COLUMNNAME = ?"); updateKeyStmt = connection.prepareStatement("UPDATE KEYS SET SURROGATEKEYVALUE = SURROGATEKEYVALUE + INCREMENT WHERE TABLENAME = ? AND COLUMNNAME = ?"); } public Long getSurrogateKey(String tableName, String columnName) throws SQLException{ Long keyValue = null; getKeyStmt.setString(1, tableName); getKeyStmt.setString(2, columnName); updateKeyStmt.setString(1, tableName); updateKeyStmt.setString(2, columnName); updateKeyStmt.execute(); ResultSet rs = getKeyStmt.executeQuery(); if (rs.next() == true) { keyValue = new Long(rs.getLong(1)); } return keyValue; } } 参考资料 您可以参阅本文在 developerWorks 全球站点上的 英文原文. IBM DB2 UDB Administration GuideIBM DB2 UDB SQL Reference关于作者Jason Zhang 是 IBM 加拿大多伦多的实验室的一名软件开发人员,从事电子商务开发已经有 5 年多的时间。他主要从事于电子商务后台解决方案的研究,例如 EJB、登台服务器(staging server)和数据库应用程序。关闭[x]关于报告滥用的帮助报告滥用谢谢! 此内容已经标识给管理员注意。关闭[x]关于报告滥用的帮助报告滥用报告滥用提交失败。 请稍后重试。关闭[x]developerWorks:登录IBM ID:需要一个 IBM ID?忘记IBM ID?密码:忘记密码?更改您的密码 保持登录。单击提交则表示您同意developerWorks 的条款和条件。 使用条款 当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。所有提交的信息确保安全。关闭[x]请选择您的昵称:当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。昵称:(长度在 3 至 31 个字符之间)单击提交则表示您同意developerWorks 的条款和条件。 使用条款. 所有提交的信息确保安全。为本文评分评论回页首
E. 什么是ETL这个职业怎么样前景如何
随着信息技术爆炸性发展,智能终端,智能穿戴设备,无人驾驶汽车等等,都宣告大专数据的时代已经属来临!学习成长为一名处理数据的BI工程师是实现梦想的绝佳途径!
如何入门呢?首先要有数据库基础,选择一门主流的数据库(ORACLE,DB2,SQLSERVER)学习基本的SQL开发,掌握存储过程,函数,包,SQL调优等。其次就要会一个主流的BI工具,常见后台ETL工具如:DATASTAGE,INFORMATICA,KETTLE等,主流前台报表工具如BIEE,COGNOS,BO,当然也有国产的像润乾等。之后就是要了解BI中常用的概念如:事实表,维表,切片,上钻下取,缓慢变化维,代理键等。
要
熟练掌握这些工具,就要在项目中去大量的练习啦,只有通过项目的实践才能深刻体会BI的这些概念及其精髓。之后有了几年的经验就可以向某个行业去深入学习
业务知识做ETL顾问,或者向数据挖掘方向深究!这个过程自学的话要很久,要想在很短的时间入门,找家有实力的机构去通过项目实践就很有必要啦。国内专注
这块的有深圳的融通学苑,北京的思数,你可根据自身情况作出选择。
F. 什么情况下使用代理键它是如何获得键值
代理键是指在关系型数据库设计中,当资料表中的候选键都不适合当主键内时,例如资料太长容,或是意义层面太多,就会用一个attribute来当代理主键,此主键可能是用流水号,来代替可辨识唯一值的主键。
在数据仓库领域有一个概念叫Surrogate key,中文一般翻译为“代理关键字”。代理关键字一般是指维度表中使用顺序分配的整数值作为主键,也称为“代理键”。代理关键字用于维度表和事实表的连接。
代理关键字的称呼有surrogate keys,meaningless keys,integer keys,nonnatural keys,artificial keys,synthetic keys等。与之相对的自然关键字的称呼有natural keys,smart keys等。
在Kimball的维度建模领域里,是强烈推荐使用代理关键字的。在维度表和事实表的每一个联接中都应该使用代理关键字,而不应该使用自然关键字或者智能关键字(Smart Keys)。数据仓库中的主键不应该是智能的,也就是说,要避免通过主键的值就可以了解一些业务信息。当然,退化维度作为事实表的复合主键之一时例外。
G. 为什么我的win2000老出现“SNMP服务忽视扩展代理键...”这个错误
首先,在“开始”——“运行”里面输入,“regedit”,打开注册表。
展开
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ SNMP \ Parameters \ ExtensionAgents
在右侧找到并删除
\ Microsoft \ IPXMibAgent \ CurrentVersion
然后重启。试试看,应该能解决。
---
不过,在此之前,建议你先备份注册表。
----------------------------
分析原因:
SNMP 仅可用于监视的 SQLServer 默认实例。 因此, 如果您没有安装默认 SQL Server 2000 实例 (只安装命名实例), 安装不创建下列 SNMP 注册表层次:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\SNMP
SNMP 服务启动由于安装正确插入值与 SQLServerSNMP 扩展代理注册表项时创建一个问题:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ExtensionAgents
H. 构建企业级数据仓库的步骤是什么
现如今,很多企业都开始重视数据仓库的构建,其实构建数据仓库不是一个难事,难的地方在于如何构建企业级的数据仓库,这对于企业来说是一件十分困难又必须提上日程的事情。不过,不要灰心,虽然困难,但是我们也可以通过一些方法去构建企业数据仓库,在这篇文章中我们就给大家介绍一下构建数据仓库的步骤。
构建企业级的数据仓库第一步就是要确定主题,其实确定主题就是确定数据分析或前端展现的主题。主题要体现出某一方面的各分析角度和统计数值型数据之间的关系,确定主题时要综合考虑。这一点是非常重要的,大家一定要重视。
第二个步骤就是确定量度。当我们确定主题后,需要考虑分析的技术指标。一般来说,这些都是数据值型数据,其中有些度量值不可以汇总。有些是可以汇总起来,以便为分析者提供有用的信息。量度是要统计的指标,必须事先选择恰当,基于不同的量度可以进行复杂关键性指标的设计和计算。
第三个步骤就是确定事实数据粒度。当我们确定量度之后,需要考虑该量度的汇总情况和不同维度下量度的聚合情况。如果我们按照“天”为单位来汇总数据的在ETL处理过程中,按天来汇总数据,些时数据仓库中量度的粒度就是“天”。如果不能确认将来的分析需求中是否要精确的秒,那么,我们要遵循”最小粒度原则”,在数据仓库中的事实表中保留每一秒的数据,对数据提前进行汇总,保障产生分析结果的效率。
第四个步骤就是确定维度,其实维度是分析的各个角度。基于不同的维度,可以看到各个量度汇总的情况,也可以基于所有的维度进行交叉分析。
第五个步骤就是创建事实表。在确定好事实数据和维度后,将考虑加载事实表。业务系统的的一笔笔生产,交易记录就是将要建立的事实表的原始数据。具体的做法是将原始表与维度表进行关联,生成事实表。关联时有为空的数据时,需要使用外连接,连接后将各维度的代理键取出放于事实表中,事实表除了各维度代理键外,还有各度量数据,不应该存在描述性信息。
在这篇文章中我们给大家介绍了构建企业级数据仓库的相关步骤,相信大家看了这篇文章以后已经对数据仓库有所了解了吧?大家在构建数据仓库的时候一定要谨遵上面的步骤进行操作,这样才能够提高工作效率,少走弯路,更出色地完成工作任务。
I. key massger 什么意思
key manager
密钥管理器;
双语例句
1
The key manager encapsulates the surrogate key generation function.
键管理器封装了代理键生成函数。
2
If you are a manager, a few days before your departure call in each of your key people and once again inquire what they are planning to do ring your absence.
7.如果你是一个经理的话,你走之前几天需要召集所有的重要员工,再问他们一次,在你离开的这段时间,他们要做些什么。
J. mysql中怎么创建代理键,命令行语法,不是图形界面中的
budong